From 4b4ee0952cf886a5a2baf160a7aea88201979aed Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期二, 06 五月 2025 17:17:13 +0800
Subject: [PATCH] PO单导入功能

---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java                      |  131 +++++++++------
 rsf-admin/src/page/orders/purchase/PurchaseList.jsx                                               |    5 
 rsf-admin/src/page/orders/purchase/PurchaseEdit.jsx                                               |   51 ++---
 rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx                                               |    7 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseItemController.java    |   37 ++++
 rsf-server/src/main/java/com/vincent/rsf/server/system/entity/DictData.java                       |   11 
 rsf-admin/src/page/waitPakin/WaitPakinList.jsx                                                    |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseItemServiceImpl.java |   31 +++
 rsf-admin/src/i18n/zh.js                                                                          |    5 
 rsf-admin/src/i18n/en.js                                                                          |    1 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/PurchaseTemplate.java        |  135 ++++++++++++++++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/PurchaseItemService.java          |    6 
 rsf-admin/src/page/orders/purchase/PurchaseCreate.jsx                                             |   33 +++-
 13 files changed, 351 insertions(+), 104 deletions(-)

diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index bcdff99..eafec23 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -599,7 +599,6 @@
                 barcode: "barcode",
                 packName: "packName",
                 ntyStatus: "ntyStatus",
-                platItemId: 'platItemId'
             },
             asnOrderLog: {
                 code: "code",
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index 9cb046b..67a0b4b 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -539,7 +539,7 @@
                 code: "ASN鍗曞彿",
                 poCode: "PO缂栫爜",
                 poId: "PO鏍囪瘑",
-                type: "绫诲瀷",
+                type: "鍗曟嵁绫诲瀷",
                 wkType: "涓氬姟绫诲瀷",
                 anfme: "璁″垝鏁伴噺",
                 qty: "瀹屾垚鏁伴噺",
@@ -587,11 +587,10 @@
                 splrCode: "渚涘簲鍟嗙紪鐮�",
                 splrName: "渚涘簲鍟�",
                 qrcode: "浜岀淮鐮�",
-                barcode: "鏉″舰鐮�",
+                barcode: "搴忓垪鐮�",
                 packName: "鍖呰",
                 ntyStatus: "鎶ユ鐘舵��",
                 prodTime: "鐢熶骇鏃ユ湡",
-                platItemId: '琛屽彿'
             },
             outStockItem: {
                 asnId: "涓诲崟鏍囪瘑",
diff --git a/rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx b/rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx
index 88563f3..8d20039 100644
--- a/rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx
+++ b/rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx
@@ -183,7 +183,7 @@
             <MyButton setCreateDialog={setCreateDialog} setmodalType={setmodalType} />
             <InspectionButton />
             <CompleteButton />
-            <DeleteButton mutationMode="pessimistic" />
+            <ODeleteButton  />
             {/* <CloseButton /> */}
           </WrapperField>
         </StyledDatagrid>
@@ -207,9 +207,8 @@
 
 const ODeleteButton = () => {
   const record = useRecordContext();
-  
   return (
-    record.exceStatus === 0 ? <DeleteButton /> : <></>
+    record.exceStatus === 0 ? <DeleteButton  mutationMode="pessimistic"/> : <></>
   )
 
 }
@@ -224,6 +223,7 @@
 
   };
   return (
+    record.exceStatus === 1 || record.exceStatus === 0 ?
     <Button
       color="primary"
       startIcon={<EditIcon />}
@@ -232,6 +232,7 @@
       label={'ra.action.edit'}
     >
     </Button>
+    : <></>
   )
 }
 
diff --git a/rsf-admin/src/page/orders/purchase/PurchaseCreate.jsx b/rsf-admin/src/page/orders/purchase/PurchaseCreate.jsx
index f44ae47..5f37416 100644
--- a/rsf-admin/src/page/orders/purchase/PurchaseCreate.jsx
+++ b/rsf-admin/src/page/orders/purchase/PurchaseCreate.jsx
@@ -33,6 +33,9 @@
 
 const PurchaseCreate = (props) => {
     const { open, setOpen } = props;
+    const dicts = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_in_stock_type')) || [];
+    const business = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_business_type'))?.filter(data => (data.group == '1')) || [];
+    console.log(business);
 
     const translate = useTranslate();
     const notify = useNotify();
@@ -93,11 +96,23 @@
                                     />
                                 </Grid> */}
                                 <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.purchase.type"
+                                    <AutocompleteInput
+                                        choices={dicts}
+                                        optionText="label"
+                                        label="table.field.asnOrder.type"
                                         source="type"
+                                        optionValue="value"
                                         parse={v => v}
-                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <AutocompleteInput
+                                        choices={business}
+                                        optionText="label"
+                                        label="table.field.asnOrder.wkType"
+                                        source="wkType"
+                                        optionValue="value"
+                                        parse={v => v}
                                     />
                                 </Grid>
                                 <Grid item xs={6} display="flex" gap={1}>
@@ -108,12 +123,12 @@
                                         validate={required()}
                                     />
                                 </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
+                                {/* <Grid item xs={6} display="flex" gap={1}>
                                     <DateInput
                                         label="table.field.purchase.preArr"
                                         source="preArr"
                                     />
-                                </Grid>
+                                </Grid> */}
                                 <Grid item xs={6} display="flex" gap={1}>
                                     <NumberInput
                                         label="table.field.purchase.anfme"
@@ -121,7 +136,7 @@
                                         validate={required()}
                                     />
                                 </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
+                                {/* <Grid item xs={6} display="flex" gap={1}>
                                     <NumberInput
                                         label="table.field.purchase.qty"
                                         source="qty"
@@ -134,7 +149,7 @@
                                         source="workQty"
                                         validate={required()}
                                     />
-                                </Grid>
+                                </Grid> */}
                                 <Grid item xs={6} display="flex" gap={1}>
                                     <TextInput
                                         label="table.field.purchase.channel"
@@ -142,13 +157,13 @@
                                         parse={v => v}
                                     />
                                 </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
+                                {/* <Grid item xs={6} display="flex" gap={1}>
                                     <TextInput
                                         label="table.field.purchase.platCode"
                                         source="platCode"
                                         parse={v => v}
                                     />
-                                </Grid>
+                                </Grid> */}
                                 <Grid item xs={6} display="flex" gap={1}>
                                     <DateInput
                                         label="table.field.purchase.startTime"
diff --git a/rsf-admin/src/page/orders/purchase/PurchaseEdit.jsx b/rsf-admin/src/page/orders/purchase/PurchaseEdit.jsx
index 759b842..dd146a1 100644
--- a/rsf-admin/src/page/orders/purchase/PurchaseEdit.jsx
+++ b/rsf-admin/src/page/orders/purchase/PurchaseEdit.jsx
@@ -42,7 +42,8 @@
 
 const PurchaseEdit = () => {
     const translate = useTranslate();
-
+    const dicts = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_in_stock_type')) || [];
+    const business = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_business_type'))?.filter(data => (data.group == '1')) || [];
     return (
         <>
             <Edit
@@ -59,7 +60,7 @@
                     defaultValues={{}}
                 // validate={(values) => { }}
                 >
-                    <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
+                    <Grid container width={{ xs: '100%', xl: '100%' }} rowSpacing={3} columnSpacing={3}>
                         <Grid item xs={18} md={10}>
                             <Typography variant="h6" gutterBottom>
                                 {translate('common.edit.title.main')}
@@ -73,21 +74,27 @@
                             />
                         </Stack> */}
                             <Stack direction='row' gap={2}>
-                                <TextInput
-                                    label="table.field.purchase.type"
-                                    source="type$"
+                                <AutocompleteInput
+                                    choices={dicts}
+                                    optionText="label"
+                                    label="table.field.asnOrder.type"
+                                    source="type"
+                                    optionValue="value"
                                     parse={v => v}
-                                    validate={required()}
+                                />
+                                <AutocompleteInput
+                                    choices={business}
+                                    optionText="label"
+                                    label="table.field.asnOrder.wkType"
+                                    source="wkType"
+                                    optionValue="value"
+                                    parse={v => v}
                                 />
                                 <TextInput
                                     label="table.field.purchase.source"
                                     source="source"
                                     parse={v => v}
                                     validate={required()}
-                                />
-                                <DateInput
-                                    label="table.field.purchase.preArr"
-                                    source="preArr"
                                 />
                                 <NumberInput
                                     label="table.field.purchase.anfme"
@@ -96,15 +103,10 @@
                                 />
                             </Stack>
                             <Stack direction='row' gap={2}>
-                                <NumberInput
-                                    label="table.field.purchase.qty"
-                                    source="qty"
-                                    validate={required()}
-                                />
-                                <NumberInput
-                                    label="table.field.purchase.workQty"
-                                    source="workQty"
-                                    validate={required()}
+                                <TextInput
+                                    label="table.field.purchase.project"
+                                    source="project"
+                                    parse={v => v}
                                 />
                                 <TextInput
                                     label="table.field.purchase.channel"
@@ -116,20 +118,13 @@
                                     source="platCode"
                                     parse={v => v}
                                 />
-                            </Stack>
-                            <Stack direction='row' gap={2}>
-                            <DateInput
+                                <DateInput
                                     label="table.field.purchase.startTime"
                                     source="startTime"
                                 />
                                 <DateInput
                                     label="table.field.purchase.endTime"
                                     source="endTime"
-                                />
-                                <TextInput
-                                    label="table.field.purchase.project"
-                                    source="project"
-                                    parse={v => v}
                                 />
                             </Stack>
                         </Grid>
@@ -144,7 +139,7 @@
                     </Grid>
                 </SimpleForm>
             </Edit >
-            <PurchaseItemList />                            
+            <PurchaseItemList />
         </>
     )
 }
diff --git a/rsf-admin/src/page/orders/purchase/PurchaseList.jsx b/rsf-admin/src/page/orders/purchase/PurchaseList.jsx
index 3cbbd27..df7db49 100644
--- a/rsf-admin/src/page/orders/purchase/PurchaseList.jsx
+++ b/rsf-admin/src/page/orders/purchase/PurchaseList.jsx
@@ -43,6 +43,7 @@
 import MyField from "../../components/MyField";
 import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
 import * as Common from '@/utils/common';
+import ImportButton from "../../components/ImportButton";
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
   '& .css-1vooibu-MuiSvgIcon-root': {
@@ -86,10 +87,8 @@
 
 const PurchaseList = () => {
   const translate = useTranslate();
-
   const [createDialog, setCreateDialog] = useState(false);
   const [drawerVal, setDrawerVal] = useState(false);
-
   const navigate = useNavigate();
   const assign = (record) => {
     navigate(`/purchaseItem?poId=${record.id}`);
@@ -115,6 +114,7 @@
             <FilterButton />
             <MyCreateButton onClick={() => { setCreateDialog(true) }} />
             <SelectColumnsButton preferenceKey='purchase' />
+            <ImportButton value={'purchaseItem'} />
             <MyExportButton />
           </TopToolbar>
         )}
@@ -131,6 +131,7 @@
           <NumberField source="id" />
           <TextField source="code" label="table.field.purchase.code" />
           <TextField source="type$" label="table.field.purchase.type" />
+          <TextField source="wkType$" label="table.field.purchase.wkType" />
           <TextField source="source" label="table.field.purchase.source" />
           <DateField source="preArr" label="table.field.purchase.preArr" showTime />
           <NumberField source="anfme" label="table.field.purchase.anfme" />
diff --git a/rsf-admin/src/page/waitPakin/WaitPakinList.jsx b/rsf-admin/src/page/waitPakin/WaitPakinList.jsx
index 43aa899..a4eb8c8 100644
--- a/rsf-admin/src/page/waitPakin/WaitPakinList.jsx
+++ b/rsf-admin/src/page/waitPakin/WaitPakinList.jsx
@@ -58,7 +58,7 @@
         width: 90
     },
     '& .opt': {
-        width: 180
+        width: 210
     },
 }));
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseItemController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseItemController.java
index 8cdfc2d..4f48be8 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseItemController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseItemController.java
@@ -10,11 +10,15 @@
 import com.vincent.rsf.server.common.domain.KeyValVo;
 import com.vincent.rsf.server.common.domain.PageParam;
 import com.vincent.rsf.server.manager.entity.PurchaseItem;
+import com.vincent.rsf.server.manager.entity.excel.AsnOrderTemplate;
+import com.vincent.rsf.server.manager.entity.excel.PurchaseTemplate;
 import com.vincent.rsf.server.manager.service.PurchaseItemService;
 import com.vincent.rsf.server.system.controller.BaseController;
+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.*;
@@ -107,4 +111,37 @@
         ExcelUtil.build(ExcelUtil.create(purchaseItemService.list(), PurchaseItem.class), response);
     }
 
+    /**
+     * ASN鍗曟嵁鏄庣粏瀵煎叆
+     * @param file
+     * @return
+     */
+    @PostMapping("/purchaseItem/import")
+    @ApiOperation("PO鍗曞鍏ユ帴鍙�")
+    @PreAuthorize("hasAuthority('manager:purchaseItem:update')")
+    public R importExcel(@RequestParam(value = "file") MultipartFile file) throws Exception {
+        if (Objects.isNull(file)) {
+            return R.error("鏂囦欢涓嶈兘涓虹┖锛侊紒");
+        }
+        return purchaseItemService.excelImport(file, getLoginUserId());
+    }
+
+
+    /**
+     * @author Ryan
+     * @description 涓嬭浇妯℃澘
+     * @param
+     * @return
+     * @time 2025/4/18 08:17
+     */
+    @PostMapping("/purchaseItem/template/download")
+    @ApiOperation("涓嬭浇鏀惰揣鍗曟ā鏉�")
+    @PreAuthorize("hasAuthority('manager:purchaseItem:update')")
+    public void downloadTemplate(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
+        PurchaseTemplate template = ExcelUtil.mockData(PurchaseTemplate.class);
+        List<PurchaseTemplate> list = Arrays.asList(template);
+        ExcelUtil.build(ExcelUtil.create(list, PurchaseTemplate.class, true), response);
+    }
+
+
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java
index 5bf17f1..d9ba537 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java
@@ -10,11 +10,14 @@
 import com.vincent.rsf.server.system.service.DictDataService;
 import lombok.experimental.Accessors;
 import org.springframework.format.annotation.DateTimeFormat;
+
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+
 import com.baomidou.mybatisplus.annotation.TableLogic;
+
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.text.SimpleDateFormat;
@@ -31,6 +34,7 @@
 import com.vincent.rsf.framework.common.SpringUtils;
 import com.vincent.rsf.server.system.service.UserService;
 import com.vincent.rsf.server.system.entity.User;
+
 import java.io.Serializable;
 import java.util.Date;
 
@@ -44,21 +48,24 @@
     /**
      * ID
      */
-    @ApiModelProperty(value= "ID")
+    @ApiModelProperty(value = "ID")
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
     /**
      * 閲囪喘鍗曞彿
      */
-    @ApiModelProperty(value= "閲囪喘鍗曞彿")
+    @ApiModelProperty(value = "閲囪喘鍗曞彿")
     private String code;
 
     /**
      * 鍗曟嵁绫诲瀷
      */
-    @ApiModelProperty(value= "鍗曟嵁绫诲瀷")
+    @ApiModelProperty(value = "鍗曟嵁绫诲瀷")
     private String type;
+
+    @ApiModelProperty("涓氬姟绫诲瀷")
+    private String wkType;
 
 
     @ApiModelProperty(value = "erp涓诲崟鏍囪瘑")
@@ -67,121 +74,122 @@
     /**
      * 鍗曟嵁鏉ユ簮
      */
-    @ApiModelProperty(value= "鍗曟嵁鏉ユ簮")
+    @ApiModelProperty(value = "鍗曟嵁鏉ユ簮")
     private String source;
 
     /**
      * 棰勮鍒拌揪鏃堕棿
      */
-    @ApiModelProperty(value= "棰勮鍒拌揪鏃堕棿")
-    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "棰勮鍒拌揪鏃堕棿")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date preArr;
 
     /**
      * 闇�姹傛暟閲�
      */
-    @ApiModelProperty(value= "闇�姹傛暟閲�")
+    @ApiModelProperty(value = "闇�姹傛暟閲�")
     private Double anfme;
 
     /**
      * 宸叉敹璐ф暟閲�
      */
-    @ApiModelProperty(value= "宸叉敹璐ф暟閲�")
+    @ApiModelProperty(value = "宸叉敹璐ф暟閲�")
     private Double qty;
 
     /**
      * 宸叉敹璐ф暟閲�
      */
-    @ApiModelProperty(value= "鏀惰揣涓暟閲�")
+    @ApiModelProperty(value = "鏀惰揣涓暟閲�")
     private Double workQty;
 
     /**
      * 鏀惰揣閬撳彛
      */
-    @ApiModelProperty(value= "鏀惰揣閬撳彛")
+    @ApiModelProperty(value = "鏀惰揣閬撳彛")
     private String channel;
 
     /**
      * erp鍗曞彿
      */
-    @ApiModelProperty(value= "erp鍗曞彿")
+    @ApiModelProperty(value = "erp鍗曞彿")
     private String platCode;
 
     /**
      * 璁″垝鏀惰揣鏃堕棿
      */
-    @ApiModelProperty(value= "璁″垝鏀惰揣鏃堕棿")
-    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "璁″垝鏀惰揣鏃堕棿")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date startTime;
 
     /**
      * 璁″垝鏀惰揣缁撴潫鏃堕棿
      */
-    @ApiModelProperty(value= "璁″垝鏀惰揣缁撴潫鏃堕棿")
-    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "璁″垝鏀惰揣缁撴潫鏃堕棿")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date endTime;
 
     /**
      * 椤圭洰缂栫爜
      */
-    @ApiModelProperty(value= "椤圭洰缂栫爜")
+    @ApiModelProperty(value = "椤圭洰缂栫爜")
     private String project;
 
     /**
-     * 鐘舵�� 1: 姝e父  0: 鍐荤粨  
+     * 鐘舵�� 1: 姝e父  0: 鍐荤粨
      */
-    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 鍐荤粨  ")
+    @ApiModelProperty(value = "鐘舵�� 1: 姝e父  0: 鍐荤粨  ")
     private Integer status;
 
     /**
-     * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  
+     * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�
      */
-    @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  ")
+    @ApiModelProperty(value = "鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  ")
     private Integer deleted;
 
     /**
      * 绉熸埛
      */
-    @ApiModelProperty(value= "绉熸埛")
+    @ApiModelProperty(value = "绉熸埛")
     private Integer tenantId;
 
     /**
      * 娣诲姞浜哄憳
      */
-    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    @ApiModelProperty(value = "娣诲姞浜哄憳")
     private Long createBy;
 
     /**
      * 娣诲姞鏃堕棿
      */
-    @ApiModelProperty(value= "娣诲姞鏃堕棿")
-    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @ApiModelProperty(value = "娣诲姞鏃堕棿")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
 
     /**
      * 淇敼浜哄憳
      */
-    @ApiModelProperty(value= "淇敼浜哄憳")
+    @ApiModelProperty(value = "淇敼浜哄憳")
     private Long updateBy;
 
     /**
      * 淇敼鏃堕棿
      */
-    @ApiModelProperty(value= "淇敼鏃堕棿")
-    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @ApiModelProperty(value = "淇敼鏃堕棿")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date updateTime;
 
     /**
      * 澶囨敞
      */
-    @ApiModelProperty(value= "澶囨敞")
+    @ApiModelProperty(value = "澶囨敞")
     private String memo;
 
-    public Purchase() {}
+    public Purchase() {
+    }
 
-    public Purchase(String code,String type,String source,String platId ,Date preArr,Double anfme,Double qty,Double workQty,String channel,String platCode,Date startTime,Date endTime,String project,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
+    public Purchase(String code, String type, String source, String platId, Date preArr, Double anfme, Double qty, Double workQty, String channel, String platCode, Date startTime, Date endTime, String project, Integer status, Integer deleted, Integer tenantId, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo) {
         this.code = code;
         this.type = type;
         this.source = source;
@@ -242,30 +250,46 @@
         return dictDatas.getLabel();
     }
 
-    public String getPreArr$(){
-        if (Cools.isEmpty(this.preArr)){
+    public String getWkType$() {
+        if (Cools.isEmpty(this.wkType)) {
+            return "";
+        }
+        DictDataService dictDataService = SpringUtils.getBean(DictDataService.class);
+        DictData dictData = dictDataService.getOne(new LambdaQueryWrapper<DictData>()
+                .eq(DictData::getDictTypeCode, DictTypeCode.DICT_SYS_BUSINESS_TYPE)
+                .eq(DictData::getValue, this.wkType));
+        if (Objects.isNull(dictData)) {
+            return null;
+        }
+        return dictData.getLabel();
+    }
+
+    public String getPreArr$() {
+        if (Cools.isEmpty(this.preArr)) {
             return "";
         }
         return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.preArr);
     }
 
-    public String getStartTime$(){
-        if (Cools.isEmpty(this.startTime)){
+    public String getStartTime$() {
+        if (Cools.isEmpty(this.startTime)) {
             return "";
         }
         return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.startTime);
     }
 
-    public String getEndTime$(){
-        if (Cools.isEmpty(this.endTime)){
+    public String getEndTime$() {
+        if (Cools.isEmpty(this.endTime)) {
             return "";
         }
         return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.endTime);
     }
 
-    public String getStatus$(){
-        if (null == this.status){ return null; }
-        switch (this.status){
+    public String getStatus$() {
+        if (null == this.status) {
+            return null;
+        }
+        switch (this.status) {
             case 1:
                 return "姝e父";
             case 0:
@@ -275,43 +299,44 @@
         }
     }
 
-    public String getCreateBy$(){
+    public String getCreateBy$() {
         UserService service = SpringUtils.getBean(UserService.class);
         User user = service.getById(this.createBy);
-        if (!Cools.isEmpty(user)){
+        if (!Cools.isEmpty(user)) {
             return String.valueOf(user.getNickname());
         }
         return null;
     }
 
-    public String getCreateTime$(){
-        if (Cools.isEmpty(this.createTime)){
+    public String getCreateTime$() {
+        if (Cools.isEmpty(this.createTime)) {
             return "";
         }
         return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
     }
 
-    public String getUpdateBy$(){
+    public String getUpdateBy$() {
         UserService service = SpringUtils.getBean(UserService.class);
         User user = service.getById(this.updateBy);
-        if (!Cools.isEmpty(user)){
+        if (!Cools.isEmpty(user)) {
             return String.valueOf(user.getNickname());
         }
         return null;
     }
 
-    public String getUpdateTime$(){
-        if (Cools.isEmpty(this.updateTime)){
+    public String getUpdateTime$() {
+        if (Cools.isEmpty(this.updateTime)) {
             return "";
         }
         return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
     }
 
 
-
-    public Boolean getStatusBool(){
-        if (null == this.status){ return null; }
-        switch (this.status){
+    public Boolean getStatusBool() {
+        if (null == this.status) {
+            return null;
+        }
+        switch (this.status) {
             case 1:
                 return true;
             case 0:
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/PurchaseTemplate.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/PurchaseTemplate.java
new file mode 100644
index 0000000..a1f9433
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/PurchaseTemplate.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 PurchaseTemplate implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Excel(name = "PO鍗曞彿")
+    @ApiModelProperty(value= "PO鍗曞彿")
+    @ExcelComment(value = "poCode", example = "PO25413975")
+    private String poCode;
+
+
+    @Excel(name = "鍗曟嵁绫诲瀷")
+    @ApiModelProperty(value= "鍗曟嵁绫诲瀷")
+    @ExcelComment(value = "type", example = "閲囪喘鍏ュ簱鍗�")
+    private String type;
+
+    @Excel(name = "鏉ユ簮骞冲彴")
+    @ApiModelProperty(value= "鏉ユ簮骞冲彴")
+    @ExcelComment(value = "source", example = "ERP")
+    private String source;
+
+
+    @Excel(name = "涓氬姟绫诲瀷")
+    @ApiModelProperty(value= "涓氬姟绫诲瀷")
+    @ExcelComment(value = "wkType", example = "ERP")
+    private String wkType;
+
+
+    @Excel(name = "椤圭洰鍚嶇О")
+    @ApiModelProperty(value= "椤圭洰鍚嶇О")
+    @ExcelComment(value = "project", example = "浜笢鐢靛晢绔嬪簱")
+    private String project;
+
+
+    @Excel(name = "琛屽彿")
+    @ApiModelProperty(value= "琛屽彿")
+    @ExcelComment(value = "platItemId", example = "100068541001")
+    private String platItemId;
+
+    /**
+     * 鐗╂枡缂栫爜
+     */
+    @Excel(name = "鐗╂枡缂栫爜")
+    @ApiModelProperty(value= "鐗╂枡缂栫爜")
+    @ExcelComment(value = "matnrCode", example = "101000000002")
+    private String matnrCode;
+
+    /**
+     *
+     */
+    @Excel(name = "鐗╂枡鍚嶇О")
+    @ApiModelProperty(value= "鐗╂枡鍚嶇О")
+    @ExcelComment(value = "matnrName", example = "TC-03128瀵歌繛浣撳唴涓婃墭")
+    private String matnrName;
+
+    /**
+     * 鍗曚綅
+     */
+    @Excel(name = "鍗曚綅")
+    @ApiModelProperty(value= "鍗曚綅")
+    @ExcelComment(value = "unit", example = "涓�")
+    private String unit;
+
+    /**
+     * 鏁伴噺
+     */
+    @Excel(name = "鏁伴噺")
+    @ApiModelProperty(value= "鏁伴噺")
+    @ExcelComment(value = "anfme", example = "75")
+    private Double anfme;
+
+    /**
+     * 宸叉敹鏁伴噺
+     */
+    @Excel(name = "宸叉敹鏁伴噺")
+    @ApiModelProperty(value= "宸叉敹鏁伴噺")
+    @ExcelComment(value = "qty", example = "0")
+    private Double qty;
+
+    /**
+     * 鏍囧噯鍖呰
+     */
+    @Excel(name = "鏍囧噯鍖呰")
+    @ApiModelProperty(value= "鏍囧噯鍖呰")
+    @ExcelComment(value = "nromQty", example = "1")
+    private Double nromQty;
+
+    /**
+     * 鏉$爜鎵撳嵃鏁伴噺
+     */
+    @Excel(name = "鏉$爜鎵撳嵃鏁伴噺")
+    @ApiModelProperty(value= "鏉$爜鎵撳嵃鏁伴噺")
+    @ExcelComment(value = "printQty", example = "0")
+    private Double printQty;
+
+    /**
+     * 渚涘簲鍟嗗悕绉�
+     */
+    @Excel(name = "渚涘簲鍟嗗悕绉�")
+    @ApiModelProperty(value= "渚涘簲鍟嗗悕绉�")
+    @ExcelComment(value = "splrName", example = "娴欐睙涓壃绔嬪簱鎶�鏈湁闄愬叕鍙�")
+    private String splrName;
+
+    /**
+     * 渚涘簲鍟嗙紪鐮�
+     */
+    @Excel(name = "渚涘簲鍟嗙紪鐮�")
+    @ApiModelProperty(value= "渚涘簲鍟嗙紪鐮�")
+    @ExcelComment(value = "splrCode", example = "685947")
+    private String splrCode;
+
+    /**
+     * 渚涘簲鍟嗘壒娆�
+     */
+    @Excel(name = "渚涘簲鍟嗘壒娆�")
+    @ApiModelProperty(value= "渚涘簲鍟嗘壒娆�")
+    @ExcelComment(value = "splrBatch", example = "20250401")
+    private String splrBatch;
+
+
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/PurchaseItemService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/PurchaseItemService.java
index 4a9042d..8d0180a 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/PurchaseItemService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/PurchaseItemService.java
@@ -1,8 +1,14 @@
 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.PurchaseItem;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.HashMap;
 
 public interface PurchaseItemService extends IService<PurchaseItem> {
 
+    R excelImport(MultipartFile file, Long loginUserId) throws Exception;
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseItemServiceImpl.java
index 6b36072..15131db 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseItemServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseItemServiceImpl.java
@@ -1,12 +1,43 @@
 package com.vincent.rsf.server.manager.service.impl;
 
+import cn.afterturn.easypoi.excel.ExcelImportUtil;
+import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult;
+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.excel.AsnOrderTemplate;
+import com.vincent.rsf.server.manager.entity.excel.PurchaseTemplate;
 import com.vincent.rsf.server.manager.mapper.PurchaseItemMapper;
 import com.vincent.rsf.server.manager.entity.PurchaseItem;
 import com.vincent.rsf.server.manager.service.PurchaseItemService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.HashMap;
 
 @Service("purchaseItemService")
 public class PurchaseItemServiceImpl extends ServiceImpl<PurchaseItemMapper, PurchaseItem> implements PurchaseItemService {
 
+    /**
+     * @author Ryan
+     * @date 2025/5/6
+     * @description: PO鍗曞鍏ュ姛鑳�
+     * @version 1.0
+     */
+    @Override
+    public R excelImport(MultipartFile file, Long loginUserId) throws Exception {
+        ExcelImportResult result = ExcelImportUtil.importExcelMore(file.getInputStream(), PurchaseTemplate.class, ExcelUtil.getDefaultImportParams());
+        if (result.getList().isEmpty()) {
+            throw new CoolException("鐗╂枡瀵煎叆澶辫触锛侊紒");
+        }
+        if (result.getList().isEmpty()) {
+            throw new CoolException("琛ㄦ牸鍐呭涓嶈兘涓虹┖锛侊紒");
+        }
+
+
+
+        return null;
+    }
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/DictData.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/DictData.java
index 0c0100d..29ef44b 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/DictData.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/DictData.java
@@ -1,6 +1,7 @@
 package com.vincent.rsf.server.system.entity;
 
-import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.*;
+
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
@@ -10,10 +11,7 @@
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableLogic;
-import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -73,6 +71,11 @@
     @ApiModelProperty(value= "棰滆壊銆備緥濡傦細#FFFFFF銆乥lue銆乺gba(0,0,0,0.5)")
     private String color;
 
+
+    @ApiModelProperty("鍒嗙粍鏍囪瘑")
+    @TableField("`group`")
+    private String group;
+
     /**
      * 鐘舵�� 1: 姝e父  0: 鍐荤粨  
      */

--
Gitblit v1.9.1