From 3170c2aca0583f801a5527c124103cfbff2bb306 Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期一, 14 七月 2025 15:01:13 +0800 Subject: [PATCH] 盘点单功能优化 --- rsf-server/src/main/java/com/vincent/rsf/server/manager/service/CheckOrderItemService.java | 7 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CheckOrderItemServiceImpl.java | 12 + rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java | 3 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CheckOrderItemController.java | 154 +++++++++++++++ rsf-server/src/main/resources/mapper/manager/CheckOrderItemMapper.xml | 5 rsf-admin/src/page/orders/check/CheckOrderList.jsx | 45 +-- rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CheckOrderController.java | 23 ++ rsf-server/src/main/java/com/vincent/rsf/server/manager/service/CheckOrderService.java | 5 rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/CheckOrderItemMapper.java | 12 + rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/CheckOrderTemplate.java | 135 +++++++++++++ rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/CheckOrderType.java | 19 + rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CheckOrderServiceImpl.java | 100 ++++++++++ rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java | 4 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java | 12 + rsf-admin/src/i18n/zh.js | 1 rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderType.java | 10 rsf-server/src/main/resources/application-dev.yml | 2 17 files changed, 509 insertions(+), 40 deletions(-) diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js index 8cc2781..ccda278 100644 --- a/rsf-admin/src/i18n/zh.js +++ b/rsf-admin/src/i18n/zh.js @@ -637,6 +637,7 @@ poCode: "DO鍗曞彿", poId: "DO鏍囪瘑", type: "绫诲瀷", + checkType: '鐩樼偣绫诲瀷', wkType: "涓氬姟绫诲瀷", anfme: "鏁伴噺", workQty: '鎵ц鏁�', diff --git a/rsf-admin/src/page/orders/check/CheckOrderList.jsx b/rsf-admin/src/page/orders/check/CheckOrderList.jsx index 36a9b6d..228316d 100644 --- a/rsf-admin/src/page/orders/check/CheckOrderList.jsx +++ b/rsf-admin/src/page/orders/check/CheckOrderList.jsx @@ -5,39 +5,26 @@ DatagridConfigurable, SearchInput, TopToolbar, - Toolbar, SelectColumnsButton, EditButton, FilterButton, - CreateButton, - ExportButton, - BulkDeleteButton, - useDataProvider, WrapperField, useRecordContext, useTranslate, useNotify, useRefresh, useListContext, - FunctionField, TextField, NumberField, DateField, - BooleanField, - ReferenceField, TextInput, - DateTimeInput, DateInput, SelectInput, NumberInput, ReferenceInput, - ReferenceArrayInput, AutocompleteInput, - DeleteButton, Button, useRedirect, - useUnselectAll, - useRecordSelection, } from 'react-admin'; import { styled } from '@mui/material/styles'; import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting'; @@ -77,20 +64,20 @@ const filters = [ <SearchInput source="condition" alwaysOn />, - <TextInput source="code" label="table.field.outStock.code" alwaysOn />, - <TextInput source="poCode" label="table.field.outStock.poCode" />, - <NumberInput source="poId" label="table.field.outStock.poId" />, - <ReferenceInput source="type" reference="dictData" filter={{ dictTypeCode: 'sys_order_type', group: '2' }} label="table.field.outStock.type" alwaysOn> - <AutocompleteInput label="table.field.outStock.type" optionValue="value" /> + <TextInput source="code" label="table.field.checkOrder.code" alwaysOn />, + <TextInput source="poCode" label="table.field.checkOrder.poCode" />, + <NumberInput source="poId" label="table.field.checkOrder.poId" />, + <ReferenceInput source="type" reference="dictData" filter={{ dictTypeCode: 'sys_order_type', group: '3' }} label="table.field.checkOrder.type" alwaysOn> + <AutocompleteInput label="table.field.checkOrder.type" optionValue="value" /> </ReferenceInput>, - <ReferenceInput source="wkType" reference="dictData" filter={{ dictTypeCode: 'sys_business_type', group: '2' }} label="table.field.outStock.wkType" alwaysOn> - <AutocompleteInput label="table.field.outStock.wkType" optionValue="value" /> + <ReferenceInput source="wkType" reference="dictData" filter={{ dictTypeCode: 'sys_check_order_type'}} label="table.field.checkOrder.wkType" alwaysOn> + <AutocompleteInput label="table.field.checkOrder.wkType" optionValue="value" /> </ReferenceInput>, - <NumberInput source="anfme" label="table.field.outStock.anfme" />, - <NumberInput source="qty" label="table.field.outStock.qty" />, - <TextInput source="logisNo" label="table.field.outStock.logisNo" />, - <DateInput source="arrTime" label="table.field.outStock.arrTime" />, - <SelectInput source="rleStatus" label="table.field.outStock.rleStatus" + <NumberInput source="anfme" label="table.field.checkOrder.anfme" />, + <NumberInput source="qty" label="table.field.checkOrder.qty" />, + <TextInput source="logisNo" label="table.field.checkOrder.logisNo" />, + <DateInput source="arrTime" label="table.field.checkOrder.arrTime" />, + <SelectInput source="rleStatus" label="table.field.checkOrder.rleStatus" choices={[ { id: 0, name: ' 姝e父' }, { id: 1, name: ' 宸查噴鏀�' }, @@ -99,7 +86,7 @@ <TextInput label="common.field.memo" source="memo" />, <DictionarySelect - label='table.field.outStock.exceStatus' + label='table.field.checkOrder.exceStatus' name="exceStatus" dictTypeCode="sys_asn_exce_status" alwaysOn @@ -120,7 +107,7 @@ const [modalType, setmodalType] = useState(0); const [select, setSelect] = useState(0); const billReload = useRef(); - const dicts = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_business_type')) || []; + const dicts = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_check_order_type')) || []; //鑾峰彇娉㈡瑙勫垯 // const closeDialog = async (value) => { @@ -156,7 +143,7 @@ <CreateByOrderButton setCreateDialog={setCreateDialog} /> <MyCreateButton onClick={() => { setManualDialog(true); setmodalType(0) }} /> <SelectColumnsButton preferenceKey='check' /> - <ImportButton value={'outStockItem'} /> + <ImportButton value={'checkItem'} /> </TopToolbar> )} perPage={DEFAULT_PAGE_SIZE} @@ -172,7 +159,7 @@ <TextField source="code" label="table.field.checkOrder.code" /> <TextField source="poCode" label="table.field.checkOrder.poCode" /> <TextField source="type$" label="table.field.checkOrder.type" /> - <TextField cellClassName="wkType" source="wkType$" label="table.field.checkOrder.wkType" /> + <TextField cellClassName="wkType" source="checkType$" label="table.field.checkOrder.wkType" /> <NumberField source="anfme" label="table.field.checkOrder.anfme" /> <NumberField source="workQty" label="table.field.checkOrder.workQty" /> <NumberField source="qty" label="table.field.checkOrder.qty" /> diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CheckOrderController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CheckOrderController.java index 51845f5..48ffb18 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CheckOrderController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CheckOrderController.java @@ -17,9 +17,12 @@ import com.vincent.rsf.server.system.controller.BaseController; import com.vincent.rsf.server.system.utils.SerialRuleUtils; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + import javax.servlet.http.HttpServletResponse; import java.util.*; @@ -29,7 +32,6 @@ @Autowired private CheckOrderService checkOrderService; - @PreAuthorize("hasAuthority('manager:check:list')") @PostMapping("/check/page") @@ -122,4 +124,23 @@ ExcelUtil.build(ExcelUtil.create(orders, AsnOrder.class), response); } + + + /** + * 鐩樼偣鍗曞鍏� + * @param file + * @return + */ + @PostMapping("/check/import") + @ApiOperation("ASN瀵煎叆鎺ュ彛") + @PreAuthorize("hasAuthority('manager:check:update')") + public R importExcel(@RequestParam(value = "file") MultipartFile file) throws Exception { + if (Objects.isNull(file)) { + return R.error("鏂囦欢涓嶈兘涓虹┖锛侊紒"); + } + HashMap<String, Object> hashMap = new HashMap<>(); + return checkOrderService.excelImport(file, hashMap, getLoginUserId()); + } + + } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CheckOrderItemController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CheckOrderItemController.java new file mode 100644 index 0000000..470fa54 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CheckOrderItemController.java @@ -0,0 +1,154 @@ +package com.vincent.rsf.server.manager.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.vincent.rsf.framework.common.Cools; +import com.vincent.rsf.framework.common.R; +import com.vincent.rsf.server.common.annotation.OperationLog; +import com.vincent.rsf.server.common.domain.BaseParam; +import com.vincent.rsf.server.common.domain.KeyValVo; +import com.vincent.rsf.server.common.domain.PageParam; +import com.vincent.rsf.server.common.utils.ExcelUtil; +import com.vincent.rsf.server.manager.entity.AsnOrderItem; +import com.vincent.rsf.server.manager.entity.excel.AsnOrderTemplate; +import com.vincent.rsf.server.manager.entity.excel.CheckOrderTemplate; +import com.vincent.rsf.server.manager.service.CheckOrderItemService; +import com.vincent.rsf.server.system.constant.SerialRuleCode; +import com.vincent.rsf.server.system.controller.BaseController; +import com.vincent.rsf.server.system.utils.SerialRuleUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.*; + +/** + * @author Ryan + * @date 2025/7/14 + * @description: 鐩樼偣鏄庣粏 + * @version 1.0 + */ +@Api("鐩樼偣鏄庣粏") +@RestController +public class CheckOrderItemController extends BaseController { + + @Autowired + private CheckOrderItemService checkOrderItemService; + + + @PreAuthorize("hasAuthority('manager:checkItem:list')") + @PostMapping("/checkItem/page") + public R page(@RequestBody Map<String, Object> map) { + BaseParam baseParam = buildParam(map, BaseParam.class); + PageParam<AsnOrderItem, BaseParam> pageParam = new PageParam<>(baseParam, AsnOrderItem.class); + QueryWrapper<AsnOrderItem> wrapper = pageParam.buildWrapper(true); + return R.ok().add(checkOrderItemService.page(pageParam, wrapper)); + } + + @PreAuthorize("hasAuthority('manager:checkItem:list')") + @PostMapping("/checkItem/list") + public R list(@RequestBody Map<String, Object> map) { + return R.ok().add(checkOrderItemService.list()); + } + + @PreAuthorize("hasAuthority('manager:checkItem:list')") + @PostMapping({"/checkItem/many/{ids}", "/checkItem/many/{ids}"}) + public R many(@PathVariable Long[] ids) { + return R.ok().add(checkOrderItemService.listByIds(Arrays.asList(ids))); + } + + @PreAuthorize("hasAuthority('manager:checkItem:list')") + @GetMapping("/checkItem/{id}") + public R get(@PathVariable("id") Long id) { + return R.ok().add(checkOrderItemService.getById(id)); + } + + @PreAuthorize("hasAuthority('manager:checkItem:save')") + @OperationLog("Create 瀛楀吀鏁版嵁闆�") + @PostMapping("/checkItem/save") + public R save(@RequestBody AsnOrderItem order) { + String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_CHECK_RULE_CODE, order); + if (Objects.isNull(ruleCode)) { + throw new RuntimeException("鐩樼偣鍗曞彿鐢熸垚澶辫触锛侊紒"); + } + if (!checkOrderItemService.save(order)) { + return R.error("Save Fail"); + } + return R.ok("Save Success").add(order); + } + + @PreAuthorize("hasAuthority('manager:checkItem:update')") + @OperationLog("Update 瀛楀吀鏁版嵁闆�") + @PostMapping("/checkItem/update") + public R update(@RequestBody AsnOrderItem order) { + order.setUpdateTime(null); + order.setUpdateBy(getLoginUserId()); + if (!checkOrderItemService.updateById(order)) { + return R.error("Update Fail"); + } + return R.ok("Update Success").add(order); + } + + @PreAuthorize("hasAuthority('manager:checkItem:remove')") + @OperationLog("Delete 瀛楀吀鏁版嵁闆�") + @PostMapping("/checkItem/remove/{ids}") + public R remove(@PathVariable Long[] ids) { + if (!checkOrderItemService.removeByIds(Arrays.asList(ids))) { + return R.error("Delete Fail"); + } + return R.ok("Delete Success").add(ids); + } + + @PreAuthorize("hasAuthority('manager:checkItem:list')") + @PostMapping("/checkItem/query") + public R query(@RequestParam(required = false) String condition) { + List<KeyValVo> vos = new ArrayList<>(); + LambdaQueryWrapper<AsnOrderItem> wrapper = new LambdaQueryWrapper<>(); + if (!Cools.isEmpty(condition)) { + wrapper.like(AsnOrderItem::getAsnCode, condition); + } + checkOrderItemService.page(new Page<>(1, 20), wrapper).getRecords().forEach( + item -> vos.add(new KeyValVo(item.getId(), item.getAsnCode())) + ); + return R.ok().add(vos); + } + + /** + * @author Ryan + * @date 2025/7/14 + * @description: 鐩樼偣鍗曞鍑� + * @version 1.0 + */ + @PreAuthorize("hasAuthority('manager:checkItem:list')") + @PostMapping("/checkItem/export") + public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception { + List<AsnOrderItem> orders = new ArrayList<>(); + if (!Objects.isNull(map.get("ids"))) { + orders = checkOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>().in(AsnOrderItem::getId, map.get("ids"))); + } else { + orders = checkOrderItemService.list(); + } + ExcelUtil.build(ExcelUtil.create(orders, AsnOrderItem.class), response); + } + + /** + * @author Ryan + * @description 涓嬭浇妯℃澘 + * @param + * @return + * @time 2025/4/18 08:17 + */ + @PostMapping("/checkItem/template/download") + @ApiOperation("涓嬭浇鐩樼偣鍗曟ā鏉�") + @PreAuthorize("hasAuthority('manager:checkItem:update')") + public void downloadTemplate(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception { + CheckOrderTemplate template = ExcelUtil.mockData(CheckOrderTemplate.class); + List<CheckOrderTemplate> list = Arrays.asList(template); + ExcelUtil.build(ExcelUtil.create(list, CheckOrderTemplate.class, true), response); + } + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java index 989d23d..0a45890 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java @@ -16,10 +16,8 @@ import com.vincent.rsf.server.common.utils.ExcelUtil; import com.vincent.rsf.server.manager.entity.AsnOrderItem; import com.vincent.rsf.server.manager.entity.Companys; -import com.vincent.rsf.server.manager.entity.excel.AsnOrderTemplate; import com.vincent.rsf.server.manager.entity.excel.OutStockTemplate; import com.vincent.rsf.server.manager.enums.CompanysType; -import com.vincent.rsf.server.manager.service.AsnOrderItemService; import com.vincent.rsf.server.manager.service.CompanysService; import com.vincent.rsf.server.manager.service.OutStockItemService; import com.vincent.rsf.server.system.controller.BaseController; @@ -179,7 +177,7 @@ * @return * @time 2025/4/18 08:17 */ - @PostMapping("/outStock/template/download") + @PostMapping("/outStockItem/template/download") @ApiOperation("涓嬭浇鏀惰揣鍗曟ā鏉�") @PreAuthorize("hasAuthority('manager:outStockItem:update')") public void downloadTemplate(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception { diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java index 15833aa..8f573db 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java @@ -235,6 +235,18 @@ return dictData.getLabel(); } + public String getCheckType$(){ + if (Cools.isEmpty(this.wkType)){ + return ""; + } + DictDataService dictDataService = SpringUtils.getBean(DictDataService.class); + DictData dictData = dictDataService.getOne(new LambdaQueryWrapper<DictData>().eq(DictData::getDictTypeCode, DictTypeCode.SYS_CHECK_ORDER_TYPE).eq(DictData::getValue, this.wkType)); + if (Objects.isNull(dictData)) { + return null; + } + return dictData.getLabel(); + } + public String getArrTime$(){ if (Cools.isEmpty(this.arrTime)){ diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/CheckOrderTemplate.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/CheckOrderTemplate.java new file mode 100644 index 0000000..7118c2b --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/CheckOrderTemplate.java @@ -0,0 +1,135 @@ +package com.vincent.rsf.server.manager.entity.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import com.vincent.rsf.server.manager.entity.excel.annotation.ExcelAutoColumnSize; +import com.vincent.rsf.server.manager.entity.excel.annotation.ExcelComment; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +@Data +@ExcelAutoColumnSize +@Accessors(chain = true) +public class CheckOrderTemplate implements Serializable { + + /** + * 缂栧彿 + */ + @Excel(name = "*鐩樼偣鍗曞彿") + @ApiModelProperty(value = "*鐩樼偣鍗曞彿") + @ExcelComment(value = "code", example = "CK5945272236") + private String code; + + @Excel(name = "琛屽彿") + @ApiModelProperty("琛屽彿") + @ExcelComment(value = "platItemId", example = "1357564255478") + private String platItemId; + + @Excel(name = "瀹㈡埛璁㈠崟鍙�") + @ApiModelProperty("瀹㈡埛璁㈠崟鍙�") + @ExcelComment(value = "platOrderCode", example = "PT202564713301") + private String platOrderCode; + + @Excel(name = "宸ュ崟鍙�") + @ApiModelProperty("宸ュ崟鍙�") + @ExcelComment(value = "platWorkCode", example = "PWC2354894211") + private String platWorkCode; + + @Excel(name = "椤圭洰鍙�") + @ApiModelProperty("椤圭洰鍙�") + @ExcelComment(value = "projectCode", example = "PC2365845636001") + private String projectCode; + + /** + * 鍗曟嵁绫诲瀷 + */ + @Excel(name = "*鍗曟嵁绫诲瀷") + @ApiModelProperty(value = "*鍗曟嵁绫诲瀷") + @ExcelComment(value = "type", example = "鐩樼偣鍗�") + private String type; + + /** + * 涓氬姟绫诲瀷 + */ + @Excel(name = "*涓氬姟绫诲瀷") + @ApiModelProperty(value = "*涓氬姟绫诲瀷") + @ExcelComment(value = "wkType", example = "瀹氭湡鐩樼偣") + private String wkType; + + + @Excel(name = "*鐗╂枡缂栫爜") + @ApiModelProperty("*鐗╂枡缂栫爜") + @ExcelComment(value = "matnrCode", example = "102010101545") + private String matnrCode; + + + @Excel(name = "鐗╂枡鍚嶇О") + @ApiModelProperty("鐗╂枡鍚嶇О") + @ExcelComment(value = "maktx", example = "澶╃憺019-澶鍨嬫敮鏋�-55椋炴満杞粦鑹诧紝涓夎杞洊鍠锋紗閾惰壊 锛堝甫鏀讳笣閽夛級鍙�") + private String maktx; + + + @Excel(name = "鐗╂枡瑙勬牸") + @ApiModelProperty("鐗╂枡瑙勬牸") + @ExcelComment(value = "maktx", example = "2*3*6") + private String spec; + + + @Excel(name = "鐗╂枡鍨嬪彿") + @ApiModelProperty("鐗╂枡鍨嬪彿") + @ExcelComment(value = "maktx", example = "abc") + private String model; + + + @Excel(name = "渚涘簲鍟嗙紪鐮�") + @ApiModelProperty("渚涘簲鍟嗙紪鐮�") + @ExcelComment(value = "splrCode", example = "685947") + private String splrCode; + + @Excel(name = "渚涘簲鍟嗗悕绉�") + @ApiModelProperty("渚涘簲鍟嗗悕绉�") + @ExcelComment(value = "splrName", example = "娴欐睙涓壃绔嬪簱鎶�鏈湁闄愬叕鍙�") + private String splrName; + + + @Excel(name = "宸插畬鎴愭暟閲�") + @ApiModelProperty("宸插畬鎴愭暟閲�") + @ExcelComment(value = "qty", example = "0") + private String qty; + + + @Excel(name = "渚涘簲鍟嗘壒娆�") + @ApiModelProperty("渚涘簲鍟嗘壒娆�") + @ExcelComment(value = "splrBatch", example = "25251212") + private String splrBatch; + + @Excel(name = "*鏁伴噺") + @ApiModelProperty("*鏁伴噺") + @ExcelComment(value = "anfme", example = "75") + private String anfme; + + + @Excel(name = "鐗╂祦鍗曞彿") + @ApiModelProperty("鐗╂祦鍗曞彿") + @ExcelComment(value = "logicNo", example = "SF100064851") + private String logicNo; + + + @Excel(name = "棰勮閫佽揪鏃堕棿") + @ApiModelProperty("棰勮閫佽揪鏃堕棿") + @ExcelComment(value = "arrTime", example = "2025-05-21") + private String arrTime; + + @Excel(name = "鍖呰鍚嶇О") + @ApiModelProperty("鍖呰鍚嶇О") + @ExcelComment(value = "packName", example = "涓�") + private String packName; + + @Excel(name = "澶囨敞") + @ApiModelProperty("澶囨敞") + @ExcelComment(value = "memo", example = "娉細鏄撶鍝侊紝杞绘嬁鏀�") + private String memo; + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/CheckOrderType.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/CheckOrderType.java new file mode 100644 index 0000000..ad0ab62 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/CheckOrderType.java @@ -0,0 +1,19 @@ +package com.vincent.rsf.server.manager.enums; + +/** + * @author Ryan + * @date 2025/7/14 + * @description: 鐩樼偣鍗曠被鍨� + * @version 1.0 + */ +public enum CheckOrderType { + + CHECK_ORDER_TYPE_TEMP("1", "涓存椂鐩樼偣"), + CHECK_ORDER_TYPE_ROUND("2", "鎶芥牱鐩樼偣"), + CHECK_ORDER_TYPE_AREAS("3", "鍖哄煙鐩樼偣"), + CHECK_ORDER_TYPE_DIFF("4", "宸紓鐩樼偣"), + CHECK_ORDER_TYPE_CIRCLE("5", "寰幆鐩樼偣"), + + + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderType.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderType.java index 7a53b72..583ebdf 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderType.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderType.java @@ -27,6 +27,8 @@ return OrderType.ORDER_IN.type; } else if (desc.equals(OrderType.ORDER_OUT.desc)) { return OrderType.ORDER_OUT.type; + } else if (desc.equals(OrderType.ORDER_CHECK.desc)) { + return OrderType.ORDER_CHECK.type; } return null; } @@ -36,12 +38,8 @@ return OrderType.ORDER_IN.desc; } else if (type.equals(OrderType.ORDER_OUT.type)) { return OrderType.ORDER_OUT.desc; -// } else if (type.equals(OrderType.ORDER_PLAT_IN.type)) { -// return OrderType.ORDER_PLAT_IN.desc; -// } else if (type.equals(OrderType.ORDER_RECEIPT.type)) { -// return OrderType.ORDER_RECEIPT.desc; -// } else if (type.equals(OrderType.ORDER_PURCHASE_IN.type)) { -// return OrderType.ORDER_PURCHASE_IN.desc; + } else if (type.equals(OrderType.ORDER_CHECK.type)) { + return OrderType.ORDER_CHECK.desc; } return null; } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/CheckOrderItemMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/CheckOrderItemMapper.java new file mode 100644 index 0000000..24460a6 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/CheckOrderItemMapper.java @@ -0,0 +1,12 @@ +package com.vincent.rsf.server.manager.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.vincent.rsf.server.manager.entity.AsnOrderItem; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +@Mapper +@Repository +public interface CheckOrderItemMapper extends BaseMapper<AsnOrderItem> { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/CheckOrderItemService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/CheckOrderItemService.java new file mode 100644 index 0000000..73b78c7 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/CheckOrderItemService.java @@ -0,0 +1,7 @@ +package com.vincent.rsf.server.manager.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.vincent.rsf.server.manager.entity.AsnOrderItem; + +public interface CheckOrderItemService extends IService<AsnOrderItem> { +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/CheckOrderService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/CheckOrderService.java index 6f4fa8e..aee567f 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/CheckOrderService.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/CheckOrderService.java @@ -1,8 +1,13 @@ package com.vincent.rsf.server.manager.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.vincent.rsf.framework.common.R; import com.vincent.rsf.server.manager.entity.AsnOrder; +import org.springframework.web.multipart.MultipartFile; + +import java.util.HashMap; public interface CheckOrderService extends IService<AsnOrder> { + R excelImport(MultipartFile file, HashMap<String, Object> hashMap, Long loginUserId); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CheckOrderItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CheckOrderItemServiceImpl.java new file mode 100644 index 0000000..e638a12 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CheckOrderItemServiceImpl.java @@ -0,0 +1,12 @@ +package com.vincent.rsf.server.manager.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.vincent.rsf.server.manager.entity.AsnOrderItem; +import com.vincent.rsf.server.manager.mapper.CheckOrderItemMapper; +import com.vincent.rsf.server.manager.service.CheckOrderItemService; +import org.springframework.stereotype.Service; + +@Service("checkOrderItemService") +public class CheckOrderItemServiceImpl extends ServiceImpl<CheckOrderItemMapper, AsnOrderItem> implements CheckOrderItemService { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CheckOrderServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CheckOrderServiceImpl.java index 2c31210..a481d1f 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CheckOrderServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CheckOrderServiceImpl.java @@ -1,12 +1,112 @@ package com.vincent.rsf.server.manager.service.impl; +import cn.afterturn.easypoi.excel.ExcelImportUtil; +import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.vincent.rsf.framework.common.R; +import com.vincent.rsf.framework.exception.CoolException; +import com.vincent.rsf.server.common.utils.ExcelUtil; import com.vincent.rsf.server.manager.entity.AsnOrder; +import com.vincent.rsf.server.manager.entity.AsnOrderItem; +import com.vincent.rsf.server.manager.entity.Matnr; +import com.vincent.rsf.server.manager.entity.excel.CheckOrderTemplate; +import com.vincent.rsf.server.manager.enums.AsnExceStatus; +import com.vincent.rsf.server.manager.enums.OrderType; +import com.vincent.rsf.server.manager.enums.OrderWorkType; import com.vincent.rsf.server.manager.mapper.CheckOrderMapper; +import com.vincent.rsf.server.manager.service.CheckOrderItemService; import com.vincent.rsf.server.manager.service.CheckOrderService; +import com.vincent.rsf.server.manager.service.MatnrService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.util.*; +import java.util.stream.Collectors; @Service("checkOrderService") public class CheckOrderServiceImpl extends ServiceImpl<CheckOrderMapper, AsnOrder> implements CheckOrderService { + @Autowired + private MatnrService matnrService; + + @Autowired + private CheckOrderItemService checkOrderItemService; + + /** + * @author Ryan + * @date 2025/7/14 + * @description: 鐩樼偣鍗曞鍏� + * @version 1.0 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public R excelImport(MultipartFile file, HashMap<String, Object> hashMap, Long loginUserId) { + ExcelImportResult result = null; + try { + result = ExcelImportUtil.importExcelMore(file.getInputStream(), CheckOrderTemplate.class, ExcelUtil.getDefaultImportParams()); + } catch (Exception e) { + throw new RuntimeException(e); + } + if (result.getList().isEmpty()) { + throw new CoolException("琛ㄦ牸鍐呭涓嶈兘涓虹┖锛侊紒"); + } + List<CheckOrderTemplate> resultList = result.getList(); + Map<String, List<CheckOrderTemplate>> listMap = resultList.stream().collect(Collectors.groupingBy(CheckOrderTemplate::getCode)); + for (String key : listMap.keySet()) { + CheckOrderTemplate template = listMap.get(key).stream().findFirst().get(); + AsnOrder asnOrder = this.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getCode, template.getCode())); + if (!Objects.isNull(asnOrder)) { + continue; + } + AsnOrder order = new AsnOrder(); + order.setCode(template.getCode()) + .setMemo(template.getMemo()) + .setUpdateBy(loginUserId) + .setCreateBy(loginUserId) + .setType(OrderType.getTypeVal(template.getType())) + .setWkType(OrderWorkType.getWorkType(template.getWkType())); + if (!this.save(order)) { + throw new CoolException("鍗曟嵁淇濆瓨澶辫触锛侊紒"); + } + List<AsnOrderItem> items = new ArrayList<>(); + for (CheckOrderTemplate orderTemplate : listMap.get(key)) { + AsnOrderItem orderItem = new AsnOrderItem(); + Matnr matnr = null; + if (StringUtils.isNotBlank(orderTemplate.getMatnrCode())) { + matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>() + .eq(Matnr::getCode, orderTemplate.getMatnrCode())); + } + orderItem.setAsnId(order.getId()) + .setAsnCode(order.getCode()) + .setSplrBatch(orderTemplate.getSplrBatch()) + .setAnfme(Double.parseDouble(orderTemplate.getAnfme())) + .setSplrName(orderTemplate.getSplrName()) + .setSplrCode(orderTemplate.getSplrCode()) + .setMaktx(orderTemplate.getMaktx()) + .setMatnrCode(orderTemplate.getMatnrCode()); + if (!Objects.isNull(matnr)) { + orderItem.setMaktx(matnr.getName()).setMatnrCode(matnr.getCode()).setMatnrId(matnr.getId()); + } + items.add(orderItem); + if (!checkOrderItemService.saveBatch(items)) { + throw new CoolException("鍗曟嵁鏄庣粏淇濆瓨澶辫触锛侊紒"); + } + } + if (!items.isEmpty()) { + double purQty = items.stream().mapToDouble(AsnOrderItem::getAnfme).sum(); + if (!this.update(new LambdaUpdateWrapper<AsnOrder>() + .set(AsnOrder::getExceStatus, AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val) + .set(AsnOrder::getAnfme, purQty).eq(AsnOrder::getId, order.getId()))) { + throw new CoolException("鍗曟嵁鏁伴噺淇敼澶辫触锛侊紒"); + } + } + } + + return R.ok("鎿嶄綔鎴愬姛锛侊紒"); + } } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java index e7b98cb..9d1fb4f 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java @@ -34,6 +34,9 @@ */ public final static String DICT_SYS_BUSINESS_TYPE = "sys_business_type"; + /**鐩樼偣绫诲瀷*/ + public final static String SYS_CHECK_ORDER_TYPE = "sys_check_order_type"; + /** * 鍗曟嵁绫诲瀷 */ diff --git a/rsf-server/src/main/resources/application-dev.yml b/rsf-server/src/main/resources/application-dev.yml index 95669f3..cfb08a3 100644 --- a/rsf-server/src/main/resources/application-dev.yml +++ b/rsf-server/src/main/resources/application-dev.yml @@ -15,7 +15,7 @@ # url: jdbc:mysql://47.76.147.249:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai # username: rsf username: root - url: jdbc:mysql://127.0.0.1:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai + url: jdbc:mysql://192.168.4.151:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai password: 34821015 type: com.alibaba.druid.pool.DruidDataSource druid: diff --git a/rsf-server/src/main/resources/mapper/manager/CheckOrderItemMapper.xml b/rsf-server/src/main/resources/mapper/manager/CheckOrderItemMapper.xml new file mode 100644 index 0000000..1d04222 --- /dev/null +++ b/rsf-server/src/main/resources/mapper/manager/CheckOrderItemMapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.vincent.rsf.server.manager.mapper.CheckOrderItemMapper"> + +</mapper> -- Gitblit v1.9.1