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