From acaf6624ef2f706b8ccf442b453d802320829bd3 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期一, 07 四月 2025 16:51:16 +0800
Subject: [PATCH] # 修改 1. 任务列表修改 2. ASN执行状态修改 3. ASN扩展字段优化 4. 确认收货扩展字段优化

---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java        |    5 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/PakinIOStatus.java                  |    4 
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java                    |    3 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/MatnrServiceImpl.java        |    8 
 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java              |    3 
 rsf-admin/src/page/taskItem/TaskItemList.jsx                                                      |    1 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java              |    4 
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java           |   96 +++----
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WarehouseAreasItem.java            |   21 +
 rsf-admin/src/page/task/TaskPanel.jsx                                                             |  184 +++++----------
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java         |   14 
 rsf-server/src/main/java/com/vincent/rsf/server/common/utils/FieldsUtils.java                     |   93 +++++--
 rsf-admin/src/page/task/TaskList.jsx                                                              |    6 
 rsf-server/src/main/java/com/vincent/rsf/server/system/utils/ExtendFieldsUtils.java               |  108 +++-----
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java |   27 +
 rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/AsnExceStatus.java                  |   27 ++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java     |   75 ++++-
 rsf-server/src/main/java/com/vincent/rsf/server/common/utils/JSONUtil.java                        |    7 
 rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/ReceiptDetlsDto.java               |    3 
 19 files changed, 361 insertions(+), 328 deletions(-)

diff --git a/rsf-admin/src/page/task/TaskList.jsx b/rsf-admin/src/page/task/TaskList.jsx
index 72cfe20..9fdda18 100644
--- a/rsf-admin/src/page/task/TaskList.jsx
+++ b/rsf-admin/src/page/task/TaskList.jsx
@@ -114,7 +114,7 @@
                     marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                 }}
                 title={"menu.task"}
-                empty={<EmptyData onClick={() => { }} />}
+                empty={false}
                 filters={filters}
                 sort={{ field: "sort", order: "desc" }}
                 actions={(
@@ -174,10 +174,6 @@
                     </WrapperField>
                 </StyledDatagrid>
             </List>
-            {/* <TaskCreate
-                open={createDialog}
-                setOpen={setCreateDialog}
-            /> */}
             <PageDrawer
                 title='Task Detail'
                 drawerVal={drawerVal}
diff --git a/rsf-admin/src/page/task/TaskPanel.jsx b/rsf-admin/src/page/task/TaskPanel.jsx
index 24270ed..853c1a3 100644
--- a/rsf-admin/src/page/task/TaskPanel.jsx
+++ b/rsf-admin/src/page/task/TaskPanel.jsx
@@ -13,127 +13,71 @@
     const translate = useTranslate();
     return (
         <>
-            <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}>
-                <CardContent>
-                    <Grid container spacing={2}>
-                        <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}>
-                            <Typography variant="h6" gutterBottom align="left" sx={{
-                                maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' },
-                                whiteSpace: 'nowrap',
-                                overflow: 'hidden',
-                                textOverflow: 'ellipsis',
-                            }}>
-                                {Common.camelToPascalWithSpaces(translate('table.field.task.id'))}: {record.id}
-                            </Typography>
-                            {/*  inherit, primary, secondary, textPrimary, textSecondary, error */}
-                            <Typography variant="h6" gutterBottom align="right" >
-                                ID: {record.id}
-                            </Typography>
-                        </Grid>
-                    </Grid>
-                    <Grid container spacing={2}>
-                        <Grid item xs={12} container alignContent="flex-end">
-                            <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}>
-                                {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo}
-                            </Typography>
-                        </Grid>
-                    </Grid>
-                    <Box height={20}>&nbsp;</Box>
-                    <Grid container spacing={2}>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.task.taskCode" 
-                                property={record.taskCode}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.task.taskStatus" 
-                                property={record.taskStatus}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.task.taskType" 
-                                property={record.taskType}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.task.orgLoc" 
-                                property={record.orgLoc}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.task.orgSite" 
-                                property={record.orgSite}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.task.targLoc" 
-                                property={record.targLoc}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.task.targSite" 
-                                property={record.targSite}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.task.barcode" 
-                                property={record.barcode}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.task.robotCode" 
-                                property={record.robotCode}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.task.exceStatus" 
-                                property={record.exceStatus}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.task.expDesc" 
-                                property={record.expDesc}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.task.sort" 
-                                property={record.sort}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.task.expCode" 
-                                property={record.expCode}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.task.startTime" 
-                                property={record.startTime$}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.task.endTime" 
-                                property={record.endTime$}
-                            />
-                        </Grid>
+            <Box display="flex">
+                <List
+                    sx={{
+                        flexGrow: 1,
+                        transition: (theme) =>
+                            theme.transitions.create(['all'], {
+                                duration: theme.transitions.duration.enteringScreen,
+                            }),
+                        marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
+                    }}
+                    title={"menu.taskItem"}
+                    empty={false}
+                    filters={filters}
+                    sort={{ field: "create_time", order: "desc" }}
+                    actions={(
+                        <TopToolbar>
+                            <FilterButton />
+                            {/* <MyCreateButton onClick={() => { setCreateDialog(true) }} /> */}
+                            <SelectColumnsButton preferenceKey='taskItem' />
+                            {/* <MyExportButton /> */}
+                        </TopToolbar>
+                    )}
+                    perPage={DEFAULT_PAGE_SIZE}
+                >
+                    <StyledDatagrid
+                        preferenceKey='taskItem'
+                        // bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+                        rowClick={(id, resource, record) => false}
+                        // expand={() => <TaskItemPanel />}
+                        expandSingle={true}
+                        omit={['id', 'createTime', 'createBy', 'memo', 'taskId', 'orderId', 'orderItemId', 'matnrId']}
+                    >
+                        <NumberField source="id" />
+                        <NumberField source="taskId" label="table.field.taskItem.taskId" />
+                        <NumberField source="orderId" label="table.field.taskItem.orderId" />
+                        <NumberField source="orderType$" label="table.field.taskItem.orderType" />
+                        <NumberField source="orderItemId" label="table.field.taskItem.orderItemId" />
+                        <NumberField source="matnrId" label="table.field.taskItem.matnrId" />
+                        <TextField source="maktx" label="table.field.taskItem.maktx" />
+                        <TextField source="matnrCode" label="table.field.taskItem.matnrCode" />
+                        <TextField source="unit" label="table.field.taskItem.unit" />
+                        <NumberField source="anfme" label="table.field.taskItem.anfme" />
+                        <TextField source="batch" label="table.field.taskItem.batch" />
+                        <TextField source="spec" label="table.field.taskItem.spec" />
+                        <TextField source="model" label="table.field.taskItem.model" />
 
-                    </Grid>
-                </CardContent>
-            </Card >
+                        <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
+                            <TextField source="nickname" />
+                        </ReferenceField>
+                        <DateField source="updateTime" label="common.field.updateTime" showTime />
+                        <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
+                            <TextField source="nickname" />
+                        </ReferenceField>
+                        <DateField source="createTime" label="common.field.createTime" showTime />
+                        <BooleanField source="statusBool" label="common.field.status" sortable={false} />
+                        <TextField source="memo" label="common.field.memo" sortable={false} />
+                    </StyledDatagrid>
+                </List>
+                <PageDrawer
+                    title='TaskItem Detail'
+                    drawerVal={drawerVal}
+                    setDrawerVal={setDrawerVal}
+                >
+                </PageDrawer>
+            </Box>
         </>
     );
 };
diff --git a/rsf-admin/src/page/taskItem/TaskItemList.jsx b/rsf-admin/src/page/taskItem/TaskItemList.jsx
index 42d1a09..fc2123d 100644
--- a/rsf-admin/src/page/taskItem/TaskItemList.jsx
+++ b/rsf-admin/src/page/taskItem/TaskItemList.jsx
@@ -104,6 +104,7 @@
                     marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                 }}
                 title={"menu.taskItem"}
+                empty={false}
                 filters={filters}
                 sort={{ field: "create_time", order: "desc" }}
                 actions={(
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java
index 330b9e5..3b2dbe6 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java
@@ -16,6 +16,7 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
 import java.util.Objects;
 
 /**
@@ -78,7 +79,7 @@
     @PreAuthorize("hasAuthority('manager:warehouseAreas:save')")
     @PostMapping("/orders/confirm")
     @ApiOperation("纭鏀惰揣")
-    public R confirmReceipt(@RequestBody ReceiptParams params) {
+    public R confirmReceipt(@RequestBody Map<String, Object> params) {
        if (Objects.isNull(params)) {
            throw new CoolException("璇锋眰鍙傛暟涓嶈兘涓虹┖锛侊紒");
        }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/ReceiptDetlsDto.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/ReceiptDetlsDto.java
index dbd980b..e576ffd 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/ReceiptDetlsDto.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/ReceiptDetlsDto.java
@@ -85,6 +85,9 @@
     @ApiModelProperty("渚涘簲鍟嗙紪鐮�")
     private String splrCode;
 
+    @ApiModelProperty("鎵╁睍瀛楁绱㈠紩")
+    private String fieldsIndex;
+
     @ApiModelProperty("鎵╁睍瀛楁")
     private Map<String, Object> extendFields;
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java
index 492b889..7b624a4 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java
@@ -11,6 +11,7 @@
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author Ryan
@@ -25,7 +26,7 @@
 
     R getOrderByCode(String barcode);
 
-    R receiptToWarehouse(ReceiptParams orders);
+    R receiptToWarehouse(Map<String, Object> orders);
 
     R otherReceipt(OtherReceiptParams params);
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
index df57841..b6536c2 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
@@ -1,5 +1,6 @@
 package com.vincent.rsf.server.api.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.vincent.rsf.framework.common.Cools;
 import com.vincent.rsf.framework.common.R;
@@ -13,10 +14,13 @@
 import com.vincent.rsf.server.common.enums.WarehouseAreaType;
 import com.vincent.rsf.server.common.security.JwtSubject;
 import com.vincent.rsf.server.common.utils.CommonUtil;
+import com.vincent.rsf.server.common.utils.FieldsUtils;
+import com.vincent.rsf.server.common.utils.JSONUtil;
 import com.vincent.rsf.server.common.utils.JwtUtil;
 import com.vincent.rsf.server.manager.controller.params.IsptItemsParams;
 import com.vincent.rsf.server.manager.controller.params.WaitPakinParam;
 import com.vincent.rsf.server.manager.entity.*;
+import com.vincent.rsf.server.manager.enums.AsnExceStatus;
 import com.vincent.rsf.server.manager.mapper.*;
 import com.vincent.rsf.server.manager.service.*;
 import com.vincent.rsf.server.system.constant.CodeRes;
@@ -29,6 +33,7 @@
 import com.vincent.rsf.server.system.mapper.UserMapper;
 import com.vincent.rsf.server.system.service.FieldsItemService;
 import com.vincent.rsf.server.system.service.UserLoginService;
+import com.vincent.rsf.server.system.utils.ExtendFieldsUtils;
 import com.vincent.rsf.server.system.utils.SerialRuleUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
@@ -181,25 +186,25 @@
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public R receiptToWarehouse(ReceiptParams params) {
-        if (params.getReceipts().isEmpty()) {
+    public R receiptToWarehouse(Map<String, Object> params) {
+        if (Objects.isNull(params)) {
+            throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        ReceiptParams receiptParam = JSONObject.parseObject(JSONObject.toJSONString(params), ReceiptParams.class);
+        if (receiptParam.getReceipts().isEmpty()) {
             throw new CoolException("鏀惰揣鏄庣粏涓嶈兘涓虹┖锛侊紒");
         }
-        if (Objects.isNull(params.getWhAreaId())) {
+        if (Objects.isNull(receiptParam.getWhAreaId())) {
             throw new CoolException("搴撳尯鏍囪瘑涓嶈兘涓虹┖锛侊紒");
         }
 
         WarehouseAreas areasItem = warehouseAreasService.getOne(new LambdaQueryWrapper<WarehouseAreas>()
-                .eq(WarehouseAreas::getId, params.getWhAreaId()));
+                .eq(WarehouseAreas::getId, receiptParam.getWhAreaId()));
         if (Objects.isNull(areasItem)) {
             throw new CoolException("鏁版嵁閿欒锛氬綋鍓嶅簱鍖轰笉瀛樺湪锛侊紒");
         }
-        //鑾峰彇宸插惎鐢ㄧ殑鍔ㄦ�佹墿灞曞瓧
-        List<Fields> fields = fieldsMapper.selectList(new LambdaQueryWrapper<Fields>()
-                .eq(Fields::getFlagEnable, 1)
-                .eq(Fields::getStatus, 1));
 
-        List<ReceiptDetlsDto> receipts = params.getReceipts();
+        List<ReceiptDetlsDto> receipts = receiptParam.getReceipts();
         List<WarehouseAreasItem> allOrders = new ArrayList<>();
 
         Double receiptQty = receipts.stream().mapToDouble(ReceiptDetlsDto::getReceiptQty).sum();
@@ -211,15 +216,17 @@
         if (Objects.isNull(asnOrder)) {
             throw new CoolException("鏁版嵁閿欒锛氫富鍗曚笉瀛樺湪锛侊紒");
         }
-        /**鏀惰揣鏁伴噺绱姞锛�1. 浼氬嚭瓒呮敹鎯呭喌 2. 浼氭湁鏀惰揣涓嶈冻鎯呭喌*/
+        //TODO /**鏀惰揣鏁伴噺绱姞锛�1. 浼氬嚭瓒呮敹鎯呭喌 2. 浼氭湁鏀惰揣涓嶈冻鎯呭喌*/
         Double rcptedQty = asnOrder.getQty() + receiptQty;
-        asnOrder.setQty(rcptedQty);
+        asnOrder.setQty(rcptedQty).setExceStatus(Short.parseShort(AsnExceStatus.ASN_EXCE_STATUS_EXCE_ING.val));
 
         if (!asnOrderMapper.updateById(asnOrder)) {
             throw new CoolException("宸叉敹璐ф暟閲忎慨鏀瑰け璐ワ紒锛�");
         }
-
-        receipts.forEach(dto -> {
+        List<Map<String, Object>> receipts1 = (List<Map<String, Object>>) params.get("receipts");
+        for (Map<String, Object> rcpt : receipts1) {
+            if (Objects.isNull(rcpt)) {continue;}
+            ReceiptDetlsDto dto = JSONObject.parseObject(JSONObject.toJSONString(rcpt), ReceiptDetlsDto.class);
             Matnr matnr = matnrMapper.selectById(dto.getMatnrId());
             if (Objects.isNull(matnr)) {
                 throw new CoolException("鏁版嵁閿欒锛氬綋鍓嶇墿鏂欎笉瀛樺湪锛侊紒");
@@ -227,49 +234,36 @@
             if (Objects.isNull(dto.getReceiptQty())) {
                 throw new CoolException("鏀惰揣鏁版嵁涓嶈兘涓虹┖锛侊紒");
             }
-            if (dto.getReceiptQty().compareTo(dto.getAnfme()) > 0) {
-                throw new CoolException("鏀惰揣鏁伴噺涓嶈兘澶т簬閲囪喘鏁伴噺锛侊紒");
-            }
-
+//            if (dto.getReceiptQty().compareTo(dto.getAnfme()) > 0) {
+//                throw new CoolException("鏀惰揣鏁伴噺涓嶈兘澶т簬閲囪喘鏁伴噺锛侊紒");
+//            }
             AsnOrderItem orderItem = asnOrderItemMapper.selectOne(new LambdaQueryWrapper<AsnOrderItem>()
                     .eq(AsnOrderItem::getAsnCode, asnCode)
                     .eq(AsnOrderItem::getMatnrId, dto.getMatnrId()));
             if (Objects.isNull(orderItem)) {
                 throw new CoolException("閫氱煡鍗曟槑缁嗕笉瀛樺湪锛侊紒");
             }
-//            if (Objects.isNull(dto.getReceiptQty()) || Double.compare(dto.getReceiptQty(), 0.0) == 0) {
-//                throw new CoolException("鏀惰揣鏁伴噺涓嶈兘涓洪浂锛侊紒");
-//            }
+            if (Objects.isNull(dto.getReceiptQty()) || Double.compare(dto.getReceiptQty(), 0.0) == 0) {
+                throw new CoolException("鏀惰揣鏁伴噺涓嶈兘涓洪浂锛侊紒");
+            }
             Double itemRcptQty = dto.getReceiptQty() + orderItem.getQty();
             orderItem.setQty(itemRcptQty)
                     .setSplrBatch(dto.getSplrBatch())
                     .setStockUnit(dto.getStockUnit())
                     .setProdTime(dto.getProdTime());
 
-            if (!Objects.isNull(fields)) {
-                if (!Objects.isNull(dto.getExtendFields())) {
-                    //鑾峰彇16浣島uid
-                    String uuid16 = CommonUtil.randomUUID16();
-                    Map<String, Object> extendFields = dto.getExtendFields();
-                    //瀛楁闆嗗悎鐢虫槑
-                    List<FieldsItem> fieldsItems = new ArrayList<>();
-                    extendFields.keySet().forEach(key -> {
-                        fields.forEach(obj -> {
-                            //鍒ゆ柇key鍊间笌fields琛ㄥ瓧娈垫槸鍚︾浉鍚�
-                            if (obj.getFields().equals(key)) {
-                                FieldsItem fieldsItem = new FieldsItem();
-                                fieldsItem.setMatnrId(matnr.getId()).setFieldsId(obj.getId())
-                                        .setShiperId(matnr.getShipperId())
-                                        .setValue(extendFields.get(key).toString())
-                                        .setUuid(uuid16);
-                                fieldsItems.add(fieldsItem);
-                            }
-                        });
-                    });
-                    if (!fieldsItemService.saveBatch(fieldsItems)) {
-                        throw new CoolException("鎵╁睍瀛楁淇濆瓨澶辫触锛侊紒");
+            if (!Objects.isNull(rcpt)) {
+                try {
+                    if (Objects.isNull(rcpt.get("fieldsindex")) || StringUtils.isBlank(rcpt.get("fieldsindex").toString())) {
+                        //鑾峰彇16浣島uid
+                        String uuid16 = CommonUtil.randomUUID16();
+                        rcpt.put("index", uuid16);
+                        orderItem.setFieldsIndex(uuid16);
                     }
-                    orderItem.setFieldsIndex(uuid16);
+                    //淇濆瓨鎴栨洿鏂版墿灞曞瓧娈�
+                    FieldsUtils.updateFieldsValue(rcpt);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
                 }
             }
 
@@ -283,15 +277,18 @@
 //            if (Objects.isNull(dto.getProdTime())) {
 //                 format = dateFormat.format(dto.getProdTime());
 //            }
-            item.setBarcode(dto.getBarcode())
+            item.setTrackCode(dto.getBarcode())
                     .setAreaName(areasItem.getName())
                     .setAreaId(areasItem.getId())
+                    .setAsnItemId(orderItem.getId())
+                    .setAsnCode(asnOrder.getCode())
+                    .setAsnId(asnOrder.getId())
                     .setProdTime(dto.getProdTime())
                     .setWeight(dto.getWeigth())
                     .setStockUnit(dto.getStockUnit())
                     .setBatch(SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_RECEIPT_BATCH, dto))
                     .setAnfme(itemRcptQty)
-                    .setSplrBtch(dto.getSplrBatch())
+                    .setSplrBatch(dto.getSplrBatch())
                     .setMatnrCode(matnr.getCode())
                     .setMatnrId(matnr.getId())
                     .setMatnrName(matnr.getName())
@@ -301,11 +298,10 @@
                     .setWeight(matnr.getWeight())
                     .setFieldsIndex(orderItem.getFieldsIndex())
                     .setShipperId(matnr.getShipperId());
-                    //TODO 渚涘簲鍟嗘爣璇嗘湭璁剧疆锛屾爣璇嗙敱PO鍗曚緵搴斿晢缂栫爜杞崲
-
+            //TODO 渚涘簲鍟嗘爣璇嗘湭璁剧疆锛屾爣璇嗙敱PO鍗曚緵搴斿晢缂栫爜杞崲
 
             allOrders.add(item);
-        });
+        }
 
         if (!warehouseAreasItemService.saveBatch(allOrders)) {
             throw new CoolException("鏀惰揣澶辫触锛侊紒");
@@ -383,7 +379,7 @@
 
     @Override
     public R getDeltByCode(String code) {
-        return R.ok(asnOrderItemMapper.selectOne(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getTrackCode, code)));
+        return R.ok(warehouseAreasItemService.getOne(new LambdaQueryWrapper<WarehouseAreasItem>().eq(WarehouseAreasItem::getTrackCode, code)));
     }
 
     /**
@@ -718,6 +714,7 @@
 
             detlsDto.setAsnCode(asnOrderItem.getAsnCode())
                     .setMaktx(asnOrderItem.getMaktx())
+                    .setFieldsIndex(asnOrderItem.getFieldsIndex())
                     .setBarcode(asnOrderItem.getTrackCode())
                     .setQty(asnOrderItem.getQty())
                     .setPoCode(asnOrderItem.getPoCode())
@@ -758,7 +755,6 @@
                     detlsDto.setPlatformId(purchaseItem.getPlatItemId());
                 }
             }
-
             detlsDtos.add(detlsDto);
         });
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/FieldsUtils.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/FieldsUtils.java
index ea9f543..6469f3d 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/FieldsUtils.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/FieldsUtils.java
@@ -7,6 +7,8 @@
 import com.vincent.rsf.server.system.entity.FieldsItem;
 import com.vincent.rsf.server.system.service.FieldsItemService;
 import com.vincent.rsf.server.system.service.FieldsService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 
@@ -24,7 +26,7 @@
      * @author Ryan
      * @description 閫氳繃瀛楁鍞竴鏍囪瘑鑾峰彇鍔ㄦ�佸瓧娈靛璞ey-value
      * @param
-     * @return
+     * @return 鎵╁睍瀛楁瀵硅薄
      * @time 2025/3/12 12:50
      */
     public static Map<String, String> getFields(String uuid) {
@@ -51,28 +53,42 @@
         return  fieldsMap;
     }
 
-    public static void mergeFields(Map<String, Object> fileds ,String uuid) {
+    /**
+     * @author Ryan
+     * @description 鑾峰彇闆嗗悎鎵╁睍瀛楁key-value鍊�
+     * @param
+     * @return  鍖呭惈鎵╁睍瀛楁鐨勯泦鍚堝璞�
+     * @time 2025/3/15 15:05
+     */
+    public static List<Map<String, Object>> getExtendFields(List<Map<String, Object>> params) {
         FieldsService fieldsService = SpringUtils.getBean(FieldsService.class);
-        List<Fields> fields = fieldsService.list(new LambdaQueryWrapper<Fields>().eq(Fields::getFlagEnable, 1).eq(Fields::getStatus, 1));
-        if (fields.isEmpty()) {
-            return;
-        }
+        List<Fields> fields = fieldsService.list(new LambdaQueryWrapper<Fields>()
+                .eq(Fields::getStatus, 1)
+                .eq(Fields::getFlagEnable, 1));
         FieldsItemService fieldsItemService = SpringUtils.getBean(FieldsItemService.class);
-        List<FieldsItem> fieldsItems = fieldsItemService.list(new LambdaQueryWrapper<FieldsItem>().eq(FieldsItem::getUuid, uuid));
-        for (Fields field : fields ) {
-            if (fieldsItems.isEmpty()) {
-                fileds.put(field.getFields(), null);
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (Map<String, Object> param : params) {
+            result.add(param);
+            if (Objects.isNull(param.get("fieldsIndex"))) {
                 continue;
             }
-            fieldsItems.forEach(fieldsItem -> {
-                if (fieldsItem.getFieldsId().equals(field.getId())) {
-                    fileds.put(field.getFields(), fieldsItem.getValue());
+            List<FieldsItem> itemList = fieldsItemService
+                    .list(new LambdaQueryWrapper<FieldsItem>()
+                            .eq(FieldsItem::getUuid, param.get("fieldsIndex")));
+            if (itemList.isEmpty()) {
+                continue;
+            }
+            fields.forEach(fds -> {
+                for (FieldsItem fieldsItem : itemList) {
+                    if (!Objects.isNull(fieldsItem.getFieldsId()) && fieldsItem.getFieldsId().equals(fds.getId())) {
+                        param.put(fds.getFields(), fieldsItem.getValue());
+                    }
                 }
             });
         }
-
+        return result;
     }
-    
+
     /**
      * @param template
      * @return
@@ -80,25 +96,31 @@
      * @description 鍔ㄦ�佸瓧娈祐alue淇濆瓨
      * @time 2025/3/18 15:00
      */
-    public static void saveFields(Map<String, ?> template, String uuid) throws Exception{
+    @Transactional(rollbackFor = Exception.class)
+    public static boolean saveFields(Map<String, ?> template, String uuid) throws Exception{
         List<Fields> fields = getFieldsSta();
         FieldsItemService fieldsItemService = SpringUtils.getBean(FieldsItemService.class);
-        if (fields.isEmpty()) {
-            throw new CoolException("鎵╁睍瀛楁涓嶅瓨鍦紒锛�");
-        }
         List<FieldsItem> fieldsItems = new ArrayList<>();
-        for (Fields field : fields) {
-            if (!Objects.isNull(template.get(field.getFields()))) {
-                FieldsItem item = new FieldsItem();
-                item.setFieldsId(field.getId())
-                        .setUuid(uuid)
-                        .setValue(template.get(field.getFields()).toString());
-                fieldsItems.add(item);
+        if (!fields.isEmpty()) {
+            for (Fields obj : fields) {
+                if (!Objects.isNull(template.get(obj.getFields())) && StringUtils.isNotBlank(template.get(obj.getFields()).toString())) {
+                    FieldsItem item = new FieldsItem();
+                    item.setUuid(uuid)
+                            .setValue(template.get(obj.getFields()).toString())
+                            .setMatnrId(Long.parseLong(template.get("matnrId").toString()))
+                            .setFieldsId(obj.getId());
+                    fieldsItems.add(item);
+                }
             }
+            if (fieldsItems.isEmpty()) {
+                return false;
+            }
+            if (!fieldsItemService.saveBatch(fieldsItems)) {
+                throw new CoolException("鎵╁睍瀛楁淇濆瓨澶辫触锛侊紒");
+            }
+            return true;
         }
-       if (!fieldsItemService.saveBatch(fieldsItems)) {
-           throw new CoolException("鍔ㄦ�佸瓧娈靛�间繚瀛樺け璐ワ紒锛�");
-       }
+        return false;
     }
 
     /**
@@ -110,11 +132,19 @@
         return fieldsService.list(new LambdaQueryWrapper<Fields>().eq(Fields::getStatus, 1).eq(Fields::getFlagEnable, 1));
     }
 
-    public static void updateFieldsValue(Map<String, Object> params) throws Exception{
+    /**
+     * @author Ryan
+     * @description 鍔ㄦ�佸瓧娈典慨鏀�
+     * @param
+     * @return
+     * @time 2025/4/7 15:28
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public static void updateFieldsValue(Map<String, Object> params) throws Exception {
         List<Fields> fields = getFieldsSta();
         if (fields.isEmpty()) { return; }
         Object fieldsIndex = params.get("fieldsIndex");
-        if (!Objects.isNull(fieldsIndex)) {
+        if (!Objects.isNull(fieldsIndex) && StringUtils.isNotBlank(fieldsIndex.toString())) {
             String index = fieldsIndex.toString();
             FieldsItemService fieldsItemService = SpringUtils.getBean(FieldsItemService.class);
             for (Fields field : fields) {
@@ -127,6 +157,7 @@
                             FieldsItem item = new FieldsItem();
                             item.setUuid(index)
                                     .setFieldsId(field.getId())
+                                    .setMatnrId(Long.parseLong(params.get("matnrId").toString()))
                                     .setValue(params.get(field.getFields()).toString());
                             if (!fieldsItemService.save(item)) {
                                 throw new CoolException("鎵╁睍瀛楁淇敼澶辫触锛侊紒");
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/JSONUtil.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/JSONUtil.java
index 0de14ed..6d37a50 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/JSONUtil.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/JSONUtil.java
@@ -1,8 +1,12 @@
 package com.vincent.rsf.server.common.utils;
 
+import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.ObjectWriter;
 import com.vincent.rsf.framework.common.Cools;
+import org.apache.poi.ss.formula.functions.T;
+
+import java.util.Map;
 
 /**
  * JSON瑙f瀽宸ュ叿绫�
@@ -66,4 +70,7 @@
         return null;
     }
 
+
+
+
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java
index 0ddc29c..037dee9 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java
@@ -157,18 +157,17 @@
     @PostMapping("/asnOrder/items/save")
     @ApiOperation("淇濆瓨涓诲崟鍙婃槑缁�")
     @PreAuthorize("hasAuthority('manager:asnOrder:save')")
-    public R orderAndItem(@RequestBody AsnOrderAndItemsParams params) {
+    public R orderAndItem(@RequestBody AsnOrderAndItemsParams params) throws Exception {
         if (Objects.isNull(params)) {
            return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }
-
         return asnOrderService.saveOrderAndItems(params, getLoginUserId());
     }
 
     @ApiOperation("鍗曟嵁淇℃伅淇敼")
     @PostMapping("/asnOrder/items/update")
     @PreAuthorize("hasAuthority('manager:asnOrder:update')")
-    public R orderAndrItemUpdate(@RequestBody AsnOrderAndItemsParams params) {
+    public R orderAndrItemUpdate(@RequestBody AsnOrderAndItemsParams params) throws Exception {
         if (Objects.isNull(params)) {
             return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WarehouseAreasItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WarehouseAreasItem.java
index d0b12a5..a152659 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WarehouseAreasItem.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WarehouseAreasItem.java
@@ -44,6 +44,15 @@
     @ApiModelProperty(value= "浠撳簱鍖哄煙")
     private Long areaId;
 
+    @ApiModelProperty("鍗曟嵁ID")
+    private Long asnId;
+
+    @ApiModelProperty("鍗曟嵁缂栫爜")
+    private String asnCode;
+
+    @ApiModelProperty("鍗曟嵁鏄庣粏ID")
+    private Long asnItemId;
+
     /**
      * 鍖哄煙鍚嶇О
      */
@@ -74,8 +83,8 @@
     /**
      * 鏉″舰鐮�
      */
-    @ApiModelProperty(value= "鏉″舰鐮�")
-    private String barcode;
+    @ApiModelProperty(value= "鐗╂枡璺熻釜鐮�")
+    private String trackCode;
 
     /**
      * 鏁伴噺
@@ -135,7 +144,7 @@
      * 渚涘簲鍟嗘壒娆�
      */
     @ApiModelProperty(value= "渚涘簲鍟嗘壒娆�")
-    private String splrBtch;
+    private String splrBatch;
 
     /**
      * 鐘舵�� 1: 姝e父  0: 鍐荤粨  
@@ -194,13 +203,13 @@
 
     public WarehouseAreasItem() {}
 
-    public WarehouseAreasItem(Long areaId,String areaName,Long matnrId,String matnrName,String matnrCode,String barcode,Double anfme,String batch,String unit,String stockUnit,String brand,Long shipperId,String splrId,Double weight,String prodTime,String splrBtch,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
+    public WarehouseAreasItem(Long areaId,String areaName,Long matnrId,String matnrName,String matnrCode,String trackCode,Double anfme,String batch,String unit,String stockUnit,String brand,Long shipperId,String splrId,Double weight,String prodTime,String splrBtch,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
         this.areaId = areaId;
         this.areaName = areaName;
         this.matnrId = matnrId;
         this.matnrName = matnrName;
         this.matnrCode = matnrCode;
-        this.barcode = barcode;
+        this.trackCode = trackCode;
         this.anfme = anfme;
         this.batch = batch;
         this.unit = unit;
@@ -210,7 +219,7 @@
         this.splrId = splrId;
         this.weight = weight;
         this.prodTime = prodTime;
-        this.splrBtch = splrBtch;
+        this.splrBatch = splrBtch;
         this.status = status;
         this.deleted = deleted;
         this.tenantId = tenantId;
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/AsnExceStatus.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/AsnExceStatus.java
new file mode 100644
index 0000000..51c539f
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/AsnExceStatus.java
@@ -0,0 +1,27 @@
+package com.vincent.rsf.server.manager.enums;
+
+/**
+ * @author Ryan
+ * @version 1.0
+ * @title PakinIOStatus
+ * @description
+ * @create 2025/4/7 08:48
+ */
+public enum AsnExceStatus {
+
+    //璐ㄦ鐘舵��
+    ASN_EXCE_STATUS_UN_EXCE("0", "鏈墽琛�"),
+    ASN_EXCE_STATUS_EXCE_ING("1", "鎵ц涓�"),
+    ASN_EXCE_STATUS_TASK_DONE("2", "宸插畬鎴�"),
+    ASN_EXCE_STATUS_TASK_CANCEL("3", "鍙栨秷"),
+    ASN_EXCE_STATUS_TASK_CLOSE("4", "宸插叧闂�")
+            ;
+    AsnExceStatus(String val, String desc) {
+        this.val = val;
+        this.desc = desc;
+    }
+
+    public String val;
+    public String desc;
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/PakinIOStatus.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/PakinIOStatus.java
index 6cf50cb..07e1a56 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/PakinIOStatus.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/PakinIOStatus.java
@@ -12,8 +12,8 @@
     //璐ㄦ鐘舵��
     PAKIN_IO_STATUS_HOLD("0", "寰呭叆搴�"),
     QLY_ISPT_STAS_DONE("1", "缁勬嫋瀹屾垚"),
-    QLY_ISPT_STAS_TASK_EXCE("2", "浠诲姟鎵ц涓�"),
-    QLY_ISPT_STAS_TASK_DONE("3", "浠诲姟瀹屾垚")
+    PAKIN_IO_STATUS_TASK_EXCE("2", "浠诲姟鎵ц涓�"),
+    PAKIN_IO_STATUS_TASK_DONE("3", "浠诲姟瀹屾垚")
             ;
 
     PakinIOStatus(String val, String desc) {
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java
index 64d420a..1ebb220 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java
@@ -15,9 +15,9 @@
 
     List<AsnOrder> getListByMatnr(Map<String, String> params);
 
-    R saveOrderAndItems(AsnOrderAndItemsParams params, Long loginUserId);
+    R saveOrderAndItems(AsnOrderAndItemsParams params, Long loginUserId) throws Exception;
 
-    R updateOrderItem(AsnOrderAndItemsParams params, Long loginUserId);
+    R updateOrderItem(AsnOrderAndItemsParams params, Long loginUserId) throws Exception;
 
     boolean batchUpdate(BatchUpdateParam params, Long loginUserId);
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java
index 3a98a42..74ddb6e 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java
@@ -13,7 +13,9 @@
 import com.vincent.rsf.server.api.service.ReportMsgService;
 import com.vincent.rsf.server.common.domain.BaseParam;
 import com.vincent.rsf.server.common.domain.PageParam;
+import com.vincent.rsf.server.common.utils.CommonUtil;
 import com.vincent.rsf.server.common.utils.ExcelUtil;
+import com.vincent.rsf.server.common.utils.FieldsUtils;
 import com.vincent.rsf.server.manager.controller.params.BatchUpdateParam;
 import com.vincent.rsf.server.manager.entity.AsnOrder;
 import com.vincent.rsf.server.manager.entity.excel.AsnOrderTemplate;
@@ -103,21 +105,36 @@
         return R.ok("鎿嶄綔鎴愬姛锛侊紒");
     }
 
+    /**
+     * @author Ryan
+     * @description ASN鏄庣粏鍗曟嵁淇濆瓨锛屽強鎵╁睍瀛楁淇濆瓨
+     * @param
+     * @return
+     * @time 2025/4/7 09:59
+     */
     @Override
-    public boolean fieldsSave(Map<String, Object> params) {
+    @Transactional(rollbackFor = Exception.class)
+    public boolean fieldsSave(Map<String, Object> params){
         AsnOrderItem asnOrderItem = JSONObject.parseObject(JSONObject.toJSONString(params), AsnOrderItem.class);
         if (StringUtils.isBlank(asnOrderItem.getTrackCode())) {
             String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_LABEL_CODE, asnOrderItem);
             asnOrderItem.setTrackCode(ruleCode);
         }
-        if (!this.saveOrUpdate(asnOrderItem)) {
-            throw new CoolException("鏀惰揣閫氱煡鍗曟槑缁嗕繚瀛樺け璐ワ紒锛�");
+        if (Objects.isNull(asnOrderItem.getAnfme()) || Double.compare(asnOrderItem.getAnfme(), 0.0) <= 0) {
+            throw new CoolException("璁″垝鏀惰揣鏁颁笉鑳戒负绌猴紒锛�");
         }
         //淇濆瓨鎵╁睍瀛楁
         try {
-            ExtendFieldsUtils.saveFields(params);
+            String uuid16 = CommonUtil.randomUUID16();
+            Boolean fields = FieldsUtils.saveFields(params, uuid16);
+            if (fields) {
+                asnOrderItem.setFieldsIndex(uuid16);
+            }
         } catch (Exception e) {
             throw new RuntimeException(e);
+        }
+        if (!this.saveOrUpdate(asnOrderItem)) {
+            throw new CoolException("鏀惰揣閫氱煡鍗曟槑缁嗕繚瀛樺け璐ワ紒锛�");
         }
         return true;
     }
@@ -128,7 +145,7 @@
         if (hsahMap.getRecords().isEmpty()) {
             return hsahMap.setRecords(new ArrayList<>());
         }
-        hsahMap.setRecords(ExtendFieldsUtils.getExtendFields(hsahMap.getRecords()));
+        hsahMap.setRecords(FieldsUtils.getExtendFields(hsahMap.getRecords()));
         return hsahMap;
 
     }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java
index 99b749e..15498b2 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java
@@ -13,6 +13,7 @@
 import com.vincent.rsf.server.manager.entity.AsnOrderItem;
 import com.vincent.rsf.server.manager.entity.AsnOrderItemLog;
 import com.vincent.rsf.server.manager.entity.AsnOrderLog;
+import com.vincent.rsf.server.manager.enums.AsnExceStatus;
 import com.vincent.rsf.server.manager.mapper.AsnOrderMapper;
 import com.vincent.rsf.server.manager.entity.AsnOrder;
 import com.vincent.rsf.server.manager.mapper.PurchaseMapper;
@@ -24,6 +25,7 @@
 import com.vincent.rsf.server.system.constant.SerialRuleCode;
 import com.vincent.rsf.server.system.mapper.SerialRuleMapper;
 import com.vincent.rsf.server.system.utils.SerialRuleUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -95,7 +97,8 @@
     }
 
     @Override
-    public R saveOrderAndItems(AsnOrderAndItemsParams params, Long loginUserId) {
+    @Transactional(rollbackFor = Exception.class)
+    public R saveOrderAndItems(AsnOrderAndItemsParams params, Long loginUserId) throws Exception {
         if (Objects.isNull(params.getOrders())) {
             throw new CoolException("涓诲崟淇℃伅涓嶈兘涓虹┖");
         }
@@ -116,16 +119,9 @@
         if (params.getItems().isEmpty()) {
             throw new CoolException("鏀惰揣閫氱煡鍗曟槑缁嗕笉鑳戒负瀵掗鑺傦紒锛�");
         }
-        params.getItems().forEach(item -> {
-            item.put("asnId", orders.getId());
-            item.put("asnCode", orders.getCode());
-            item.put("poCode", orders.getPoCode());
-            item.put("createBy", loginUserId);
-            item.put("updateBy", loginUserId);
-            if (!asnOrderItemService.fieldsSave(item)) {
-                throw new CoolException("鏄庣粏淇濆瓨澶辫触锛侊紒");
-            }
-        });
+
+        svaeOrUpdateOrderItem(params,loginUserId);
+
         return R.ok("淇濆瓨鎴愬姛!!");
     }
 
@@ -137,26 +133,55 @@
      * @return
      */
     @Override
-    @Transactional
-    public R updateOrderItem(AsnOrderAndItemsParams params, Long loginUserId) {
-        if (Objects.isNull(params.getOrders())) {
+    @Transactional(rollbackFor = Exception.class)
+    public R updateOrderItem(AsnOrderAndItemsParams params, Long loginUserId) throws Exception {
+        AsnOrder orders = params.getOrders();
+        if (Objects.isNull(orders)) {
             throw new CoolException("涓诲崟淇℃伅涓嶈兘涓虹┖锛侊紒");
         }
-        if (Objects.isNull(params.getOrders().getId())) {
+        if (Objects.isNull(orders.getId())) {
             throw new CoolException("鏁版嵁閿欒锛氬崟鎹甀D涓嶈兘涓虹┖锛侊紒");
         }
-        if (!this.updateById(params.getOrders())) {
+        if (!this.updateById(orders)) {
             throw new CoolException("涓诲崟淇敼澶辫触锛侊紒");
         }
         if (Objects.isNull(params.getItems()) || params.getItems().isEmpty()) {
-            return R.ok("淇敼瀹屾垚锛侊紒");
+            return R.ok("鏄庣粏鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }
-        List<Map<String, Object>> items = params.getItems();
-        List<AsnOrderItem> asnOrderItems = JSONArray.parseArray(JSONArray.toJSONString(items), AsnOrderItem.class);
-        if (!asnOrderItemService.saveOrUpdateBatch(asnOrderItems)) {
-            throw new CoolException("鏄庣粏淇敼澶辫触锛侊紒");
-        }
+
+        svaeOrUpdateOrderItem(params,loginUserId);
+
         return R.ok("淇敼瀹屾垚锛侊紒");
+    }
+
+    /**
+     * @author Ryan
+     * @description 鏇存柊鎴栦繚瀛樻槑缁�
+     * @param
+     * @return
+     * @time 2025/4/7 13:28
+     */
+    @Transactional(rollbackFor = Exception.class)
+    private void svaeOrUpdateOrderItem(AsnOrderAndItemsParams params, Long loginUserId) throws Exception{
+        AsnOrder orders = params.getOrders();
+
+        params.getItems().forEach(item -> {
+            item.put("asnId", orders.getId());
+            item.put("asnCode", orders.getCode());
+            item.put("poCode", orders.getPoCode());
+            item.put("createBy", loginUserId);
+            item.put("updateBy", loginUserId);
+            if (!asnOrderItemService.fieldsSave(item)) {
+                throw new CoolException("鏄庣粏淇濆瓨澶辫触锛侊紒");
+            }
+        });
+        List<AsnOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>()
+                .eq(AsnOrderItem::getAsnId, params.getOrders().getId()));
+        double sum = orderItems.stream().mapToDouble(AsnOrderItem::getAnfme).sum();
+        orders.setAnfme(sum);
+        if (!this.updateById(orders)) {
+            throw new CoolException("璁″垝鏀惰揣鏁伴噺淇敼澶辫触锛侊紒");
+        }
     }
 
     /**
@@ -218,9 +243,12 @@
         if (Objects.isNull(asrder) || Objects.isNull(asrder.getId())) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }
+        if (Objects.isNull(asrder.getAnfme()) || asrder.getAnfme().compareTo(0.00) == 0) {
+            throw new CoolException("鏀惰揣鏁伴噺涓嶈兘涓洪浂锛侊紒");
+        }
         AsnOrder order = this.getById(asrder.getId());
         AsnOrderLog orderLog = new AsnOrderLog();
-        order.setExceStatus(Short.valueOf("2"));
+        order.setExceStatus(Short.parseShort(AsnExceStatus.ASN_EXCE_STATUS_TASK_DONE.val));
         BeanUtils.copyProperties(order, orderLog);
         orderLog.setId(null);
         orderLog.setAsnId(order.getId());
@@ -228,6 +256,7 @@
         if (!this.saveOrUpdate(order)) {
             throw new CoolException("鐘舵�佷慨鏀瑰け璐ワ紒锛�");
         }
+        orderLog.setExceStatus(Short.parseShort(AsnExceStatus.ASN_EXCE_STATUS_TASK_CLOSE.val));
         if (!asnOrderLogService.save(orderLog)) {
             throw new CoolException("涓诲崟鍘嗗彶妗f坊鍔犲け璐ワ紒锛�");
         }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/MatnrServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/MatnrServiceImpl.java
index 07896ec..6c5fa1b 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/MatnrServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/MatnrServiceImpl.java
@@ -86,11 +86,13 @@
             }
             //鑾峰彇鍔ㄦ�佸瓧娈碉紝骞朵繚瀛樻槑缁嗗唴瀹�
             if (!FieldsUtils.getFieldsSta().isEmpty()) {
-                String uuid = CommonUtil.randomUUID16();
-                matnr.setFieldsIndex(uuid);
                 //淇濆瓨鐗╂枡鎵╁睍灞炴�у��
                 try {
-                    FieldsUtils.saveFields(template, uuid);
+                    String uuid = CommonUtil.randomUUID16();
+                    boolean b = FieldsUtils.saveFields(template, uuid);
+                    if (b) {
+                        matnr.setFieldsIndex(uuid);
+                    }
                 } catch (Exception e) {
                     throw new RuntimeException(e);
                 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
index 49e979b..5e492d8 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -72,7 +72,7 @@
                 .in(WaitPakin::getId, ids)
                 .eq(WaitPakin::getIoStatus, Short.parseShort(PakinIOStatus.QLY_ISPT_STAS_DONE.val)));
         if (waitPakins.isEmpty()) {
-            throw new CoolException("缁勬嫋淇℃伅涓嶅瓨鍦紒锛�");
+            throw new CoolException("璇锋鏌ョ粍鎷栫姸鎬佹槸鍚﹀畬鎴愶紒锛�");
         }
         waitPakins.forEach(pakin -> {
             List<TaskItem> taskItems = new ArrayList<>();
@@ -97,7 +97,6 @@
                     .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_S.type).set(Loc::getBarcode, pakin.getBarcode()))) {
                 throw new CoolException("搴撲綅棰勭害澶辫触锛侊紒");
             }
-
             /**鑾峰彇缁勬嫋鏄庣粏**/
             List<WaitPakinItem> waitPakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getPakinId, pakin.getId()));
             if (waitPakinItems.isEmpty()) {
@@ -121,12 +120,15 @@
             }
         });
 
-        waitPakinService.update(new LambdaUpdateWrapper<WaitPakin>()
-                        .in(WaitPakin::getId, ids)
-                .set(WaitPakin::getIoStatus, PakinIOStatus.QLY_ISPT_STAS_TASK_EXCE.val));
+        if (!waitPakinService.update(new LambdaUpdateWrapper<WaitPakin>()
+                .in(WaitPakin::getId, ids)
+                .set(WaitPakin::getUpdateBy, loginUserId)
+                .set(WaitPakin::getCreateBy, loginUserId)
+                .set(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val))) {
+            throw new CoolException("缁勬嫋鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+        }
         return R.ok("浠诲姟鐢熸垚瀹屾瘯锛�");
     }
-
 
     /**
      * 瀹屾垚浠诲姟
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/utils/ExtendFieldsUtils.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/utils/ExtendFieldsUtils.java
index 0ff555f..133b174 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/system/utils/ExtendFieldsUtils.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/utils/ExtendFieldsUtils.java
@@ -8,7 +8,9 @@
 import com.vincent.rsf.server.system.entity.FieldsItem;
 import com.vincent.rsf.server.system.service.FieldsItemService;
 import com.vincent.rsf.server.system.service.FieldsService;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 
@@ -21,75 +23,41 @@
  */
 public class ExtendFieldsUtils {
 
-    /**
-     * @author Ryan
-     * @description 鏄庣粏鍗曟嵁淇濆瓨鎵╁睍瀛楁
-     * @param
-     * @return
-     * @time 2025/3/15 13:36
-     */
-    public static Boolean saveFields(Map<String, Object> params) throws Exception{
-        FieldsService fieldsService = SpringUtils.getBean(FieldsService.class);
-        List<Fields> fields = fieldsService.list(new LambdaQueryWrapper<Fields>()
-                .eq(Fields::getStatus, 1)
-                .eq(Fields::getFlagEnable, 1));
-        List<FieldsItem> fieldsItems = new ArrayList<>();
-        if (!fields.isEmpty()) {
-            String uuid16 = CommonUtil.randomUUID16();
-            for (Fields obj : fields) {
-                if (!Objects.isNull(params.get(obj.getFields()))) {
-                    FieldsItem item = new FieldsItem();
-                    item.setUuid(uuid16)
-                            .setValue(params.get(obj.getFields()).toString())
-                            .setMatnrId(Long.parseLong(params.get("matnrId").toString()))
-                            .setFieldsId(obj.getId());
-                    fieldsItems.add(item);
-                }
-                params.put("fieldsIndex", uuid16);
-            }
-            FieldsItemService fieldsItemService = SpringUtils.getBean(FieldsItemService.class);
-            if (!fieldsItemService.saveBatch(fieldsItems)) {
-                throw new CoolException("鍗曟嵁鏄庣粏鎵╁睍瀛楁淇濆瓨澶辫触锛侊紒");
-            }
-        }
-        return true;
-    }
+//    /**
+//     * @author Ryan
+//     * @description 鏄庣粏鍗曟嵁淇濆瓨鎵╁睍瀛楁
+//     * @param
+//     * @return
+//     * @time 2025/3/15 13:36
+//     */
+//    @Transactional(rollbackFor = Exception.class)
+//    public static Boolean saveFields(Map<String, Object> params, String uuid) throws Exception{
+//        FieldsService fieldsService = SpringUtils.getBean(FieldsService.class);
+//        List<Fields> fields = fieldsService.list(new LambdaQueryWrapper<Fields>()
+//                .eq(Fields::getStatus, 1)
+//                .eq(Fields::getFlagEnable, 1));
+//        List<FieldsItem> fieldsItems = new ArrayList<>();
+//        if (!fields.isEmpty()) {
+//            for (Fields obj : fields) {
+//                if (!Objects.isNull(params.get(obj.getFields())) && StringUtils.isNotBlank(params.get(obj.getFields()).toString())) {
+//                    FieldsItem item = new FieldsItem();
+//                    item.setUuid(uuid)
+//                            .setValue(params.get(obj.getFields()).toString())
+//                            .setMatnrId(Long.parseLong(params.get("matnrId").toString()))
+//                            .setFieldsId(obj.getId());
+//                    fieldsItems.add(item);
+//                }
+//            }
+//            if (fieldsItems.isEmpty()) {
+//                return false;
+//            }
+//            FieldsItemService fieldsItemService = SpringUtils.getBean(FieldsItemService.class);
+//            if (!fieldsItemService.saveBatch(fieldsItems)) {
+//                throw new CoolException("鎵╁睍瀛楁淇濆瓨澶辫触锛侊紒");
+//            }
+//            return true;
+//        }
+//        return false;
+//    }
 
-
-    /**
-     * @author Ryan
-     * @description 鑾峰彇鎵╁睍瀛楁key-value鍊�
-     * @param
-     * @return
-     * @time 2025/3/15 15:05
-     */
-    public static List<Map<String, Object>> getExtendFields(List<Map<String, Object>> params) {
-        FieldsService fieldsService = SpringUtils.getBean(FieldsService.class);
-        List<Fields> fields = fieldsService.list(new LambdaQueryWrapper<Fields>()
-                .eq(Fields::getStatus, 1)
-                .eq(Fields::getFlagEnable, 1));
-        FieldsItemService fieldsItemService = SpringUtils.getBean(FieldsItemService.class);
-        List<Map<String, Object>> result = new ArrayList<>();
-        for (Map<String, Object> param : params) {
-            result.add(param);
-            if (Objects.isNull(param.get("fieldsIndex"))) {
-                continue;
-            }
-            List<FieldsItem> itemList = fieldsItemService
-                    .list(new LambdaQueryWrapper<FieldsItem>()
-                            .eq(FieldsItem::getUuid, param.get("fieldsIndex")));
-            if (itemList.isEmpty()) {
-                continue;
-            }
-            fields.forEach(fds -> {
-                for (FieldsItem fieldsItem : itemList) {
-                    if (!Objects.isNull(fieldsItem.getFieldsId()) && fieldsItem.getFieldsId().equals(fds.getId())) {
-                        param.put(fds.getFields(), fieldsItem.getValue());
-                    }
-                }
-            });
-        }
-
-        return result;
-    }
 }

--
Gitblit v1.9.1