From d44606236559adf331ee38846ef6acb1b25e5eef Mon Sep 17 00:00:00 2001
From: lty <876263681@qq.com>
Date: 星期一, 29 十二月 2025 12:18:50 +0800
Subject: [PATCH] #新增erp中间表

---
 src/main/java/com/zy/asrs/service/OrderDetlChangelogService.java          |    8 
 src/main/java/com/zy/third/erp/task/ERPItemService.java                   |   40 +
 src/main/java/com/zy/third/erp/entity/ErpOrderDetl.java                   |  526 ++++++++++++++++++++
 src/main/webapp/static/js/orderDetlChangelog/orderDetlChangelog.js        |  256 +++++++++
 src/main/java/com/zy/asrs/entity/OrderDetlChangelog.java                  |   75 ++
 src/main/java/com/zy/third/erp/task/ERPManOrderDetlScheduler.java         |    4 
 src/main/java/com/zy/asrs/controller/OrderDetlChangelogController.java    |  125 ++++
 src/main/java/com/zy/common/CodeBuilder.java                              |    2 
 src/main/java/com/zy/asrs/service/impl/OrderDetlChangelogServiceImpl.java |   12 
 src/main/webapp/views/orderDetlChangelog/orderDetlChangelog.html          |  122 ++++
 src/main/java/orderDetlChangelog.sql                                      |   18 
 src/main/java/com/zy/asrs/mapper/OrderDetlChangelogMapper.java            |   23 
 src/main/java/com/zy/third/erp/task/ERPLocDetlScheduler.java              |   59 +
 src/main/resources/mapper/OrderDetlChangelogMapper.xml                    |   28 +
 src/main/java/com/zy/third/erp/task/ERPOrderDetlScheduler.java            |  247 +++++++++
 15 files changed, 1,524 insertions(+), 21 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/OrderDetlChangelogController.java b/src/main/java/com/zy/asrs/controller/OrderDetlChangelogController.java
new file mode 100644
index 0000000..a30fc64
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/OrderDetlChangelogController.java
@@ -0,0 +1,125 @@
+package com.zy.asrs.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.core.common.DateUtils;
+import com.zy.asrs.entity.OrderDetlChangelog;
+import com.zy.asrs.service.OrderDetlChangelogService;
+import com.core.annotations.ManagerAuth;
+import com.core.common.BaseRes;
+import com.core.common.Cools;
+import com.core.common.R;
+import com.zy.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+
+@RestController
+public class OrderDetlChangelogController extends BaseController {
+
+    @Autowired
+    private OrderDetlChangelogService orderDetlChangelogService;
+
+    @RequestMapping(value = "/orderDetlChangelog/{id}/auth")
+    @ManagerAuth
+    public R get(@PathVariable("id") String id) {
+        return R.ok(orderDetlChangelogService.selectById(String.valueOf(id)));
+    }
+
+    @RequestMapping(value = "/orderDetlChangelog/list/auth")
+    @ManagerAuth
+    public R list(@RequestParam(defaultValue = "1")Integer curr,
+                  @RequestParam(defaultValue = "10")Integer limit,
+                  @RequestParam(required = false)String orderByField,
+                  @RequestParam(required = false)String orderByType,
+                  @RequestParam(required = false)String condition,
+                  @RequestParam Map<String, Object> param){
+        EntityWrapper<OrderDetlChangelog> wrapper = new EntityWrapper<>();
+        excludeTrash(param);
+        convert(param, wrapper);
+        allLike(OrderDetlChangelog.class, param.keySet(), wrapper, condition);
+        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
+        return R.ok(orderDetlChangelogService.selectPage(new Page<>(curr, limit), wrapper));
+    }
+
+    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
+        for (Map.Entry<String, Object> entry : map.entrySet()){
+            String val = String.valueOf(entry.getValue());
+            if (val.contains(RANGE_TIME_LINK)){
+                String[] dates = val.split(RANGE_TIME_LINK);
+                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
+                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
+            } else {
+                wrapper.like(entry.getKey(), val);
+            }
+        }
+    }
+
+    @RequestMapping(value = "/orderDetlChangelog/add/auth")
+    @ManagerAuth
+    public R add(OrderDetlChangelog orderDetlChangelog) {
+        orderDetlChangelogService.insert(orderDetlChangelog);
+        return R.ok();
+    }
+
+	@RequestMapping(value = "/orderDetlChangelog/update/auth")
+	@ManagerAuth
+    public R update(OrderDetlChangelog orderDetlChangelog){
+        if (Cools.isEmpty(orderDetlChangelog) || null==orderDetlChangelog.getId()){
+            return R.error();
+        }
+        orderDetlChangelogService.updateById(orderDetlChangelog);
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/orderDetlChangelog/delete/auth")
+    @ManagerAuth
+    public R delete(@RequestParam(value="ids[]") Long[] ids){
+         for (Long id : ids){
+            orderDetlChangelogService.deleteById(id);
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/orderDetlChangelog/export/auth")
+    @ManagerAuth
+    public R export(@RequestBody JSONObject param){
+        EntityWrapper<OrderDetlChangelog> wrapper = new EntityWrapper<>();
+        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
+        Map<String, Object> map = excludeTrash(param.getJSONObject("orderDetlChangelog"));
+        convert(map, wrapper);
+        List<OrderDetlChangelog> list = orderDetlChangelogService.selectList(wrapper);
+        return R.ok(exportSupport(list, fields));
+    }
+
+    @RequestMapping(value = "/orderDetlChangelogQuery/auth")
+    @ManagerAuth
+    public R query(String condition) {
+        EntityWrapper<OrderDetlChangelog> wrapper = new EntityWrapper<>();
+        wrapper.like("id", condition);
+        Page<OrderDetlChangelog> page = orderDetlChangelogService.selectPage(new Page<>(0, 10), wrapper);
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (OrderDetlChangelog orderDetlChangelog : page.getRecords()){
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", orderDetlChangelog.getId());
+            map.put("value", orderDetlChangelog.getId());
+            result.add(map);
+        }
+        return R.ok(result);
+    }
+
+    @RequestMapping(value = "/orderDetlChangelog/check/column/auth")
+    @ManagerAuth
+    public R query(@RequestBody JSONObject param) {
+        Wrapper<OrderDetlChangelog> wrapper = new EntityWrapper<OrderDetlChangelog>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
+        if (null != orderDetlChangelogService.selectOne(wrapper)){
+            return R.parse(BaseRes.REPEAT).add(getComment(OrderDetlChangelog.class, String.valueOf(param.get("key"))));
+        }
+        return R.ok();
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/OrderDetlChangelog.java b/src/main/java/com/zy/asrs/entity/OrderDetlChangelog.java
new file mode 100644
index 0000000..149fa3e
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/OrderDetlChangelog.java
@@ -0,0 +1,75 @@
+package com.zy.asrs.entity;
+
+import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.annotations.TableField;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+@Data
+@TableName("man_order_detl_changelog")
+public class OrderDetlChangelog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value= "")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value= "")
+    @TableField("action_type")
+    private String actionType;
+
+    @ApiModelProperty(value= "")
+    @TableField("order_no")
+    private String orderNo;
+
+    @ApiModelProperty(value= "")
+    private String matnr;
+
+    @ApiModelProperty(value= "")
+    private String data;
+
+    @ApiModelProperty(value= "")
+    @TableField("change_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date changeTime;
+
+    @ApiModelProperty(value= "")
+    private Boolean processed;
+
+    public OrderDetlChangelog() {}
+
+    public OrderDetlChangelog(String actionType,String orderNo,String matnr,String data,Date changeTime,Boolean processed) {
+        this.actionType = actionType;
+        this.orderNo = orderNo;
+        this.matnr = matnr;
+        this.data = data;
+        this.changeTime = changeTime;
+        this.processed = processed;
+    }
+
+//    OrderDetlChangelog orderDetlChangelog = new OrderDetlChangelog(
+//            null,    // 
+//            null,    // 
+//            null,    // 
+//            null,    // 
+//            null,    // 
+//            null    // 
+//    );
+
+    public String getChangeTime$(){
+        if (Cools.isEmpty(this.changeTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.changeTime);
+    }
+
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/OrderDetlChangelogMapper.java b/src/main/java/com/zy/asrs/mapper/OrderDetlChangelogMapper.java
new file mode 100644
index 0000000..fb4d029
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/OrderDetlChangelogMapper.java
@@ -0,0 +1,23 @@
+package com.zy.asrs.mapper;
+
+import com.zy.asrs.entity.LocDetlChangelog;
+import com.zy.asrs.entity.OrderDetlChangelog;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Mapper
+@Repository
+public interface OrderDetlChangelogMapper extends BaseMapper<OrderDetlChangelog> {
+    /**
+     * 鏌ヨ鏈悓姝ョ殑鏃ュ織
+     */
+    List<OrderDetlChangelog> selectUnprocessedLogs();
+
+    /**
+     * 鏍囪鏃ュ織宸插鐞�
+     */
+    int markProcessed(Integer id);
+}
diff --git a/src/main/java/com/zy/asrs/service/OrderDetlChangelogService.java b/src/main/java/com/zy/asrs/service/OrderDetlChangelogService.java
new file mode 100644
index 0000000..cd28be8
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/OrderDetlChangelogService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.service;
+
+import com.zy.asrs.entity.OrderDetlChangelog;
+import com.baomidou.mybatisplus.service.IService;
+
+public interface OrderDetlChangelogService extends IService<OrderDetlChangelog> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/OrderDetlChangelogServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/OrderDetlChangelogServiceImpl.java
new file mode 100644
index 0000000..094404a
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/OrderDetlChangelogServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.service.impl;
+
+import com.zy.asrs.mapper.OrderDetlChangelogMapper;
+import com.zy.asrs.entity.OrderDetlChangelog;
+import com.zy.asrs.service.OrderDetlChangelogService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("orderDetlChangelogService")
+public class OrderDetlChangelogServiceImpl extends ServiceImpl<OrderDetlChangelogMapper, OrderDetlChangelog> implements OrderDetlChangelogService {
+
+}
diff --git a/src/main/java/com/zy/common/CodeBuilder.java b/src/main/java/com/zy/common/CodeBuilder.java
index 50196c1..1ea4156 100644
--- a/src/main/java/com/zy/common/CodeBuilder.java
+++ b/src/main/java/com/zy/common/CodeBuilder.java
@@ -20,7 +20,7 @@
         generator.url="127.0.0.1:1433;databasename=tzglasrs";
         generator.username="sa";
         generator.password="sa@123";
-        generator.table="asr_loc_detl_changelog";
+        generator.table="man_order_detl_changelog";
         generator.packagePath="com.zy.asrs";
         generator.build();
     }
diff --git a/src/main/java/com/zy/third/erp/entity/ErpOrderDetl.java b/src/main/java/com/zy/third/erp/entity/ErpOrderDetl.java
new file mode 100644
index 0000000..c02b455
--- /dev/null
+++ b/src/main/java/com/zy/third/erp/entity/ErpOrderDetl.java
@@ -0,0 +1,526 @@
+package com.zy.third.erp.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.core.common.Cools;
+import com.core.common.SpringUtils;
+import com.zy.asrs.entity.Order;
+import com.zy.asrs.service.OrderService;
+import com.zy.common.utils.Synchro;
+import com.zy.system.entity.User;
+import com.zy.system.service.UserService;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@Data
+@TableName("man_order_detl_erp")
+public class ErpOrderDetl implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value = "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 璁㈠崟鍐呯爜
+     */
+    @ApiModelProperty(value = "璁㈠崟鍐呯爜")
+    @TableField("order_id")
+    private Long orderId;
+
+    /**
+     * 鍗曟嵁缂栧彿
+     */
+    @ApiModelProperty(value = "鍗曟嵁缂栧彿")
+    @TableField("order_no")
+    private String orderNo;
+
+
+    /**
+     * 鏁伴噺
+     */
+    @ApiModelProperty(value = "鏁伴噺")
+    private Double anfme;
+
+    /**
+     * 浣滀笟鏁伴噺
+     * <p>
+     * 鍏ュ簱 : 缁勬墭瀹屾垚锛岀粍鎵樻。銆佸伐浣滄。銆佸叆搴撳畬鎴愭暟閲�
+     * 鍑哄簱 : 宸ヤ綔妗c�佸嚭搴撳畬鎴愭暟閲�
+     */
+    @ApiModelProperty(value = "浣滀笟鏁伴噺")
+    @TableField("work_qty")
+    private Double workQty;
+
+    /**
+     * 瀹屾垚鏁伴噺
+     * <p>
+     * 鍏ュ簱 : qty 馃憜
+     * 鍑哄簱 : qty 馃憜
+     */
+    @ApiModelProperty(value = "瀹屾垚鏁伴噺")
+    private Double qty;
+
+    /**
+     * 鍟嗗搧缂栫爜
+     */
+    @ApiModelProperty(value = "鍟嗗搧缂栫爜")
+    private String matnr;
+
+    /**
+     * 鍟嗗搧鍚嶇О
+     */
+    @ApiModelProperty(value = "鍟嗗搧鍚嶇О")
+    private String maktx;
+
+    /**
+     * 鎵瑰彿
+     */
+    @ApiModelProperty(value = "鎵瑰彿")
+    private String batch;
+
+    /**
+     * 瑙勬牸
+     */
+    @ApiModelProperty(value = "瑙勬牸")
+    private String specs;
+
+    /**
+     * 鍨嬪彿
+     */
+    @ApiModelProperty(value = "鍨嬪彿")
+    private String model;
+
+    /**
+     * 棰滆壊
+     */
+    @ApiModelProperty(value = "棰滆壊")
+    private String color;
+
+    /**
+     * 鍝佺墝
+     */
+    @ApiModelProperty(value = "鍝佺墝")
+    private String brand;
+
+    /**
+     * 鍗曚綅
+     */
+    @ApiModelProperty(value = "鍗曚綅")
+    private String unit;
+
+    /**
+     * 鍗曚环
+     */
+    @ApiModelProperty(value = "鍗曚环")
+    private Double price;
+
+    /**
+     * sku
+     */
+    @ApiModelProperty(value = "sku")
+    private String sku;
+
+    /**
+     * 鍗曚綅閲�
+     */
+    @ApiModelProperty(value = "鍗曚綅閲�")
+    private Double units;
+
+    /**
+     * 鏉$爜
+     */
+    @ApiModelProperty(value = "鏉$爜")
+    private String barcode;
+
+    /**
+     * 浜у湴
+     */
+    @ApiModelProperty(value = "浜у湴")
+    private String origin;
+
+    /**
+     * 鍘傚
+     */
+    @ApiModelProperty(value = "鍘傚")
+    private String manu;
+
+    /**
+     * 鐢熶骇鏃ユ湡
+     */
+    @ApiModelProperty(value = "鐢熶骇鏃ユ湡")
+    @TableField("manu_date")
+    private String manuDate;
+
+    /**
+     * 鍝侀」鏁�
+     */
+    @ApiModelProperty(value = "鍝侀」鏁�")
+    @TableField("item_num")
+    private String itemNum;
+
+    /**
+     * 瀹夊叏搴撳瓨閲�
+     */
+    @ApiModelProperty(value = "瀹夊叏搴撳瓨閲�")
+    @TableField("safe_qty")
+    private Double safeQty;
+
+    /**
+     * 閲嶉噺
+     */
+    @ApiModelProperty(value = "閲嶉噺")
+    private Double weight;
+
+    /**
+     * 闀垮害
+     */
+    @ApiModelProperty(value = "闀垮害")
+    private Double length;
+
+    /**
+     * 浣撶Н
+     */
+    @ApiModelProperty(value = "浣撶Н")
+    private Double volume;
+
+    /**
+     * 涓夋柟缂栫爜
+     */
+    @ApiModelProperty(value = "涓夋柟缂栫爜")
+    @TableField("three_code")
+    private String threeCode;
+
+    /**
+     * 渚涘簲鍟�
+     */
+    @ApiModelProperty(value = "渚涘簲鍟�")
+    private String supp;
+
+    /**
+     * 渚涘簲鍟嗙紪鐮�
+     */
+    @ApiModelProperty(value = "渚涘簲鍟嗙紪鐮�")
+    @TableField("supp_code")
+    private String suppCode;
+
+    /**
+     * 鏄惁鎵规 1: 鏄�  0: 鍚�
+     */
+    @ApiModelProperty(value = "鏄惁鎵规 1: 鏄�  0: 鍚�  ")
+    @TableField("be_batch")
+    private Integer beBatch;
+
+    /**
+     * 淇濊川鏈�
+     */
+    @ApiModelProperty(value = "淇濊川鏈�")
+    @TableField("dead_time")
+    private String deadTime;
+
+    /**
+     * 棰勮澶╂暟
+     */
+    @ApiModelProperty(value = "棰勮澶╂暟")
+    @TableField("dead_warn")
+    private Integer deadWarn;
+
+    /**
+     * 鍒惰喘 1: 鍒堕��  2: 閲囪喘  3: 澶栧崗     銆併�佸疁绉戯細  鏄惁纭   1: 纭  2: 鏈‘璁�
+     */
+    @ApiModelProperty(value = "鍒惰喘 1: 鍒堕��  2: 閲囪喘  3: 澶栧崗  ")
+    private Integer source;
+
+    /**
+     * 瑕佹眰妫�楠� 1: 鏄�  0: 鍚�
+     */
+    @ApiModelProperty(value = "瑕佹眰妫�楠� 1: 鏄�  0: 鍚�  ")
+    private Integer inspect;
+
+    /**
+     * 鍗遍櫓鍝� 1: 鏄�  0: 鍚�
+     */
+    @ApiModelProperty(value = "鍗遍櫓鍝� 1: 鏄�  0: 鍚�  ")
+    private Integer danger;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 绂佺敤
+     */
+    @ApiModelProperty(value = "鐘舵�� 1: 姝e父  0: 绂佺敤  ")
+    private Integer status;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value = "娣诲姞浜哄憳")
+    @TableField("create_by")
+    private Long createBy;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value = "娣诲姞鏃堕棿")
+    @TableField("create_time")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value = "淇敼浜哄憳")
+    @TableField("update_by")
+    private Long updateBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value = "淇敼鏃堕棿")
+    @TableField("update_time")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value = "澶囨敞")
+    private String memo;
+
+    @TableField("i_no")
+    private Integer iNo;
+
+    /**
+     * 澶栭儴涓婚敭
+     */
+    @TableField("auto_id")
+    private Integer autoId;
+
+    @TableField("out_order_no")
+    private String outOrderNo;
+    /**
+     * 鐐夊彿\瀹㈡埛鍥惧彿
+     */
+    @TableField("lu_hao")
+    private String luHao;
+
+    @TableField("ware_id")
+    private String wareId;
+
+    @TableField("ware_name")
+    private String wareName;
+
+    @TableField("packing")
+    private String packing;
+    /**
+     * 宸ュ崟鍙�
+     */
+    @TableField("pg_no")
+    private String sPgNO;
+
+    @TableField("temp1")
+    private String temp1;
+
+    @TableField("temp2")
+    private String temp2;
+
+    @TableField("temp3")
+    private String temp3;
+
+    @TableField("pro_type")
+    private String proType;
+
+    @TableField("det_id")
+    private Integer detId;
+
+
+    public ErpOrderDetl() {
+    }
+
+    public ErpOrderDetl(Long orderId, String orderNo, Double anfme, Double qty, String matnr, String maktx, String batch, String specs, String model, String color, String brand, String unit, Double price, String sku, Double units, String barcode, String origin, String manu, String manuDate, String itemNum, Double safeQty, Double weight, Double length, Double volume, String threeCode, String supp, String suppCode, Integer beBatch, String deadTime, Integer deadWarn, Integer source, Integer inspect, Integer danger, Integer status, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo, Integer detId) {
+        this.orderId = orderId;
+        this.orderNo = orderNo;
+        this.anfme = anfme;
+        this.qty = qty;
+        this.matnr = matnr;
+        this.maktx = maktx;
+        this.batch = batch;
+        this.specs = specs;
+        this.model = model;
+        this.color = color;
+        this.brand = brand;
+        this.unit = unit;
+        this.price = price;
+        this.sku = sku;
+        this.units = units;
+        this.barcode = barcode;
+        this.origin = origin;
+        this.manu = manu;
+        this.manuDate = manuDate;
+        this.itemNum = itemNum;
+        this.safeQty = safeQty;
+        this.weight = weight;
+        this.length = length;
+        this.volume = volume;
+        this.threeCode = threeCode;
+        this.supp = supp;
+        this.suppCode = suppCode;
+        this.beBatch = beBatch;
+        this.deadTime = deadTime;
+        this.deadWarn = deadWarn;
+        this.source = source;
+        this.inspect = inspect;
+        this.danger = danger;
+        this.status = status;
+        this.createBy = createBy;
+        this.createTime = createTime;
+        this.updateBy = updateBy;
+        this.updateTime = updateTime;
+        this.memo = memo;
+        this.detId = detId;
+    }
+
+    public String getOrderId$() {
+        OrderService service = SpringUtils.getBean(OrderService.class);
+        Order order = service.selectById(this.orderId);
+        if (!Cools.isEmpty(order)) {
+            return String.valueOf(order.getId());
+        }
+        return null;
+    }
+
+    public String getBeBatch$() {
+        if (null == this.beBatch) {
+            return null;
+        }
+        switch (this.beBatch) {
+            case 1:
+                return "鏄�";
+            case 0:
+                return "鍚�";
+            default:
+                return String.valueOf(this.beBatch);
+        }
+    }
+
+    public String getSource$() {
+        if (null == this.source) {
+            return null;
+        }
+        switch (this.source) {
+            case 1:
+                return "鍒堕��";
+            case 2:
+                return "閲囪喘";
+            case 3:
+                return "澶栧崗";
+            default:
+                return String.valueOf(this.source);
+        }
+    }
+
+    public String getInspect$() {
+        if (null == this.inspect) {
+            return null;
+        }
+        switch (this.inspect) {
+            case 1:
+                return "鏄�";
+            case 0:
+                return "鍚�";
+            default:
+                return String.valueOf(this.inspect);
+        }
+    }
+
+    public String getDanger$() {
+        if (null == this.danger) {
+            return null;
+        }
+        switch (this.danger) {
+            case 1:
+                return "鏄�";
+            case 0:
+                return "鍚�";
+            default:
+                return String.valueOf(this.danger);
+        }
+    }
+
+    public String getStatus$() {
+        if (null == this.status) {
+            return null;
+        }
+        switch (this.status) {
+            case 1:
+                return "姝e父";
+            case 0:
+                return "绂佺敤";
+            default:
+                return String.valueOf(this.status);
+        }
+    }
+
+    public String getCreateBy$() {
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.createBy);
+        if (!Cools.isEmpty(user)) {
+            return String.valueOf(user.getUsername());
+        }
+        return null;
+    }
+
+    public String getCreateTime$() {
+        if (Cools.isEmpty(this.createTime)) {
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateBy$() {
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.updateBy);
+        if (!Cools.isEmpty(user)) {
+            return String.valueOf(user.getUsername());
+        }
+        return null;
+    }
+
+    public String getUpdateTime$() {
+        if (Cools.isEmpty(this.updateTime)) {
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+    public Double getEnableQty() {
+        if (null != this.anfme && this.workQty != null) {
+            return this.anfme - this.workQty;
+        }
+//        if (null != this.anfme && this.qty != null) {
+//            return this.anfme - this.qty;
+//        }
+        return null;
+    }
+
+    public String getQty$() {
+        if (getAnfme().equals(getQty())) {
+            return "宸插畬鎴�";
+        }
+        return "鏈畬鎴�";
+    }
+
+    public void sync(Object source) {
+        Synchro.Copy(source, this);
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/zy/third/erp/task/ERPItemService.java b/src/main/java/com/zy/third/erp/task/ERPItemService.java
index a6c865f..cfdb92b 100644
--- a/src/main/java/com/zy/third/erp/task/ERPItemService.java
+++ b/src/main/java/com/zy/third/erp/task/ERPItemService.java
@@ -98,7 +98,47 @@
                 log.info("鍚屾鏂扮墿鏂橻鍟嗗搧缂栧彿锛歿}]", mat.getMatnr());
             }
         } else {
+            Tag priTag = null;
+            if (!Cools.isEmpty(itemTB.getItemKind())) {
+                priTag = tagService.selectByName(itemTB.getItemKind(), 2);
+                if (priTag == null) {
+                    Tag top = tagService.getTop();
+                    NodeUtils nodeUtils = new NodeUtils();
+                    nodeUtils.executePath(top.getId());
+                    priTag = new Tag(
+                            null,    // 缂栧彿
+                            itemTB.getItemKind(),    // 鍚嶇О
+                            top.getId(),    // 鐖剁骇
+                            top.getName(),    // 鐖剁骇鍚嶇О
+                            nodeUtils.path.toString(),    // 鍏宠仈璺緞
+                            nodeUtils.pathName.toString(),    // 鍏宠仈璺緞鍚�
+                            0,    // 绫诲瀷
+                            null,    // 璐熻矗浜�
+                            null,    // 鍥剧墖
+                            null,    // 绠�瑕佹弿杩�
+                            null,    // 鏁伴噺
+                            2,    // 绛夌骇
+                            null,    // 鎺掑簭
+                            1,    // 鐘舵��
+                            now,    // 娣诲姞鏃堕棿
+                            null,    // 娣诲姞浜哄憳
+                            now,    // 淇敼鏃堕棿
+                            null,    // 淇敼浜哄憳
+                            null    // 澶囨敞
+                    );
+                    if (tagMapper.insert(priTag) == 0) {
+                        throw new CoolException("鏈嶅姟鍣ㄥ唴閮ㄩ敊璇紝璇疯仈绯荤鐞嗗憳");
+                    }
+                }
+            }
+            if (!Cools.isEmpty(itemTB.getItemKind())) {
+                priTag = tagService.selectByName(itemTB.getItemKind(), 2);
+            }
+
             mat = sync(mat, itemTB);
+            if (priTag!=null){
+                mat.setTagId(priTag.getId());
+            }
             if (!matService.update(mat, new EntityWrapper<Mat>().eq("matnr", itemTB.getItemId()))) {
                 throw new CoolException("鏇存柊宸插瓨鍦ㄥ晢鍝佷俊鎭け璐ワ紝璇疯仈绯荤鐞嗗憳");
             }
diff --git a/src/main/java/com/zy/third/erp/task/ERPLocDetlScheduler.java b/src/main/java/com/zy/third/erp/task/ERPLocDetlScheduler.java
index 2b42588..66a744f 100644
--- a/src/main/java/com/zy/third/erp/task/ERPLocDetlScheduler.java
+++ b/src/main/java/com/zy/third/erp/task/ERPLocDetlScheduler.java
@@ -1,5 +1,6 @@
 package com.zy.third.erp.task;
 
+import com.core.exception.CoolException;
 import com.zy.asrs.entity.LocDetl;
 import com.zy.asrs.entity.LocDetlChangelog;
 import com.zy.asrs.mapper.LocDetlChangelogMapper;
@@ -35,7 +36,7 @@
     @Scheduled(cron = "${erp.refreshtime}")
     public void LocDetlScheduler() {
         if (!erpEnabled) return;
-
+        boolean result = false;
         List<LocDetlChangelog> logs = locDetlChangelogMapper.selectUnprocessedLogs();
 
         for (LocDetlChangelog changelog : logs) {
@@ -45,10 +46,14 @@
                 Map<String, Object> content = locDetlToMap(item);
 
                 switch (action) {
-                    case "INSERT":
+                   case "INSERT":
                         String insertSql = buildInsertSql("asr_loc_detl", content);
-                        erpSqlServer.update(insertSql);
-                        log.info("鍚屾ERP鏂板鎴愬姛: locNo={}", item.getLocNo());
+                        if(erpSqlServer.update(insertSql) > 0){
+                            log.info("鍚屾ERP鏂板鎴愬姛: locNo={}", item.getLocNo());
+                            result = true;
+                        }else{
+                            log.info("鍚屾ERP鏂板澶辫触: locNo={}", item.getLocNo());
+                        }
                         break;
 
                     case "UPDATE":
@@ -56,7 +61,6 @@
                             // 瑙f瀽 JSON
                             Map<String, Object> dataMap = JSON.parseObject(changelog.getData(), Map.class);
                             Map<String, Object> afterMap = (Map<String, Object>) dataMap.get("after");
-
                             // 鎷兼帴 UPDATE SQL
                             StringBuilder setSql = new StringBuilder();
                             afterMap.forEach((k, v) -> {
@@ -69,27 +73,42 @@
                                 }
                             });
                             setSql.deleteCharAt(setSql.length() - 1); // 鍘绘帀鏈�鍚庨�楀彿
-
-                            String updateSql = "UPDATE asr_loc_detl SET " + setSql + " WHERE loc_no='" + escapeSql((String)afterMap.get("loc_no")) + "' AND zpallet='" + escapeSql((String)afterMap.get("zpallet")) + "'";
-                            erpSqlServer.update(updateSql);
-
-                            log.info("鍚屾ERP鏇存柊鎴愬姛: locNo={}, zpallet={}", afterMap.get("loc_no"), afterMap.get("zpallet"));
+                            String updateSql =
+                                    "UPDATE asr_loc_detl SET " + setSql +
+                                            " WHERE loc_no='" + escapeSql((String)afterMap.get("loc_no")) +
+                                            "' AND zpallet='" + escapeSql((String)afterMap.get("zpallet")) +
+                                            "' AND matnr='" + escapeSql((String)afterMap.get("matnr")) + "'";
+                            if(erpSqlServer.update(updateSql) > 0){
+                                log.info("鍚屾ERP鏇存柊鎴愬姛: locNo={}, zpallet={}", afterMap.get("loc_no"), afterMap.get("zpallet"));
+                                result = true;
+                            }else{
+                                log.info("鍚屾ERP鏇存柊澶辫触: locNo={}, zpallet={}", afterMap.get("loc_no"), afterMap.get("zpallet"));
+                            }
                         } catch (Exception e) {
                             log.error("鏇存柊ERP澶辫触: locNo=" + changelog.getLocNo(), e);
                         }
-
-                    case "DELETE":
-                        String deleteSql = "DELETE FROM asr_loc_detl WHERE loc_no='" + escapeSql(item.getLocNo()) + "'";
-                        erpSqlServer.update(deleteSql);
-                        log.info("鍚屾ERP鍒犻櫎鎴愬姛: locNo={}", item.getLocNo());
                         break;
-
+                    case "DELETE":
+                        String deleteSql = "DELETE FROM asr_loc_detl WHERE " +
+                                "loc_no='" + escapeSql(item.getLocNo()) + "' AND " +
+                                "zpallet='" + escapeSql(item.getZpallet()) + "' AND " +
+                                "matnr='" + escapeSql(item.getMatnr()) + "' AND " +
+                                "anfme=" + item.getAnfme();
+                        if(erpSqlServer.update(deleteSql) > 0){
+                            log.info("鍚屾ERP鍒犻櫎鎴愬姛: locNo={}", item.getLocNo());
+                            result = true;
+                        }else{
+                            log.info("鍚屾ERP鍒犻櫎澶辫触: locNo={}", item.getLocNo());
+                        }
+                        break;
                     default:
                         log.error("鏈煡鎿嶄綔绫诲瀷锛�" + action);
                 }
-
-                locDetlChangelogMapper.markProcessed(changelog.getId());
-
+                if(result){
+                    locDetlChangelogMapper.markProcessed(changelog.getId());
+                }else {
+                    throw new CoolException("鍚屾澶辫触");
+                }
             } catch (Exception e) {
                 log.error("鍚屾ERP澶辫触锛屾棩蹇桰D锛�" + changelog.getId(), e);
             }
@@ -192,4 +211,4 @@
         if (str == null) return "";
         return str.replace("'", "''");
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/zy/third/erp/task/ERPManOrderDetlScheduler.java b/src/main/java/com/zy/third/erp/task/ERPManOrderDetlScheduler.java
new file mode 100644
index 0000000..7031f25
--- /dev/null
+++ b/src/main/java/com/zy/third/erp/task/ERPManOrderDetlScheduler.java
@@ -0,0 +1,4 @@
+package com.zy.third.erp.task;
+
+public class ERPManOrderDetlScheduler {
+}
diff --git a/src/main/java/com/zy/third/erp/task/ERPOrderDetlScheduler.java b/src/main/java/com/zy/third/erp/task/ERPOrderDetlScheduler.java
new file mode 100644
index 0000000..e8e8dad
--- /dev/null
+++ b/src/main/java/com/zy/third/erp/task/ERPOrderDetlScheduler.java
@@ -0,0 +1,247 @@
+package com.zy.third.erp.task;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.core.exception.CoolException;
+import com.zy.asrs.entity.LocDetl;
+import com.zy.asrs.entity.LocDetlChangelog;
+import com.zy.asrs.entity.OrderDetl;
+import com.zy.asrs.entity.OrderDetlChangelog;
+import com.zy.asrs.mapper.LocDetlChangelogMapper;
+import com.zy.asrs.mapper.OrderDetlChangelogMapper;
+import com.zy.asrs.service.OrderDetlService;
+import com.zy.common.service.erp.ErpSqlServer;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Component
+public class ERPOrderDetlScheduler {
+    @Autowired
+    private ErpSqlServer erpSqlServer;
+    @Autowired
+    private OrderDetlService orderDetlService;
+    @Autowired
+    private OrderDetlChangelogMapper OrderDetlChangelogMapper;
+    @Value("${erp.enabled}")
+    private Boolean erpEnabled;
+    @Transactional(rollbackFor = Throwable.class)
+    @Scheduled(cron = "0 */30 * * * ?")
+    public void ERPOrderDetlScheduler() {
+        if (!erpEnabled) return;
+        boolean result = false;
+        List<OrderDetlChangelog> logs = OrderDetlChangelogMapper.selectUnprocessedLogs();
+        List<OrderDetl> orderDetlList = orderDetlService.selectList(new EntityWrapper<>()); // 鑾峰彇涓昏〃鎵�鏈夋暟鎹�
+
+        for (OrderDetl item : orderDetlList) {
+            try {
+                // 鏍规嵁鍞竴鏍囪瘑 (order_no, matnr, out_order_no) 妫�鏌ュ壇琛ㄦ槸鍚﹀凡鏈夋暟鎹�
+                boolean exists = checkIfExistsInErp(item);
+                if (!exists) {
+                    // 濡傛灉鍓〃涓病鏈夎褰曪紝鎻掑叆鏂版暟鎹�
+                    insertIntoErp(item);
+                }
+            } catch (Exception e) {
+                log.error("澶勭悊ERP鍚屾澶辫触锛孫rderDetl ID锛�" + item.getOrderNo(), e);
+            }
+        }
+        for (OrderDetlChangelog changelog : logs) {
+            try {
+                String action = changelog.getActionType();
+                OrderDetl item = parseJsonToItem(changelog.getData());
+                Map<String, Object> content = locDetlToMap(item);
+
+                switch (action) {
+                    case "UPDATE":
+                        try {
+                            // 瑙f瀽 JSON
+                            Map<String, Object> dataMap = JSON.parseObject(changelog.getData(), Map.class);
+                            Map<String, Object> afterMap = (Map<String, Object>) dataMap.get("after");
+                            // 鎷兼帴 UPDATE SQL
+                            StringBuilder setSql = new StringBuilder();
+                            afterMap.forEach((k, v) -> {
+                                if (v == null) {
+                                    setSql.append("[").append(k).append("]=NULL,");
+                                } else if (v instanceof Number) {
+                                    setSql.append("[").append(k).append("]=").append(v).append(",");
+                                } else {
+                                    setSql.append("[").append(k).append("]='").append(((String)v).replace("'", "''")).append("',");
+                                }
+                            });
+                            setSql.deleteCharAt(setSql.length() - 1); // 鍘绘帀鏈�鍚庨�楀彿
+                            String updateSql =
+                                    "UPDATE man_order_detl_erp SET " + setSql +
+                                            " WHERE order_no='" + escapeSql((String)afterMap.get("order_no")) +
+                                            "' AND out_order_no='" + escapeSql((String)afterMap.get("out_order_no")) +
+                                            "' AND matnr='" + escapeSql((String)afterMap.get("matnr")) + "'";
+                            if(erpSqlServer.update(updateSql) > 0){
+                                log.info("鍚屾ERP鏇存柊鎴愬姛: orderNo={}, matnr={}", afterMap.get("order_no"), afterMap.get("matnr"));
+                                result = true;
+                            }else{
+                                log.info("鍚屾ERP鏇存柊澶辫触: orderNo={}, matnr={}", afterMap.get("order_no"), afterMap.get("matnr"));
+                            }
+                        } catch (Exception e) {
+                            log.error("鏇存柊ERP澶辫触: locNo=" + changelog.getOrderNo(), e);
+                        }
+                        break;
+                    case "DELETE":
+                        String deleteSql = "DELETE FROM man_order_detl_erp WHERE " +
+                                "order_no='" + escapeSql(item.getOrderNo()) + "' AND " +
+                                "out_order_no='" + escapeSql(item.getOutOrderNo()) + "' AND " +
+                                "matnr='" + escapeSql(item.getMatnr()) + "' AND " +
+                                "anfme=" + item.getAnfme();
+                        if(erpSqlServer.update(deleteSql) > 0){
+                            log.info("鍚屾ERP鍒犻櫎鎴愬姛: orderNo={},matnr={}", item.getOrderNo(),item.getMatnr());
+                            result = true;
+                        }else{
+                            log.info("鍚屾ERP鍒犻櫎澶辫触: orderNo={},matnr={}", item.getOrderNo(),item.getMatnr());
+                        }
+                        break;
+                    default:
+                        log.error("鏈煡鎿嶄綔绫诲瀷锛�" + action);
+                }
+                if(result){
+                    OrderDetlChangelogMapper.markProcessed(changelog.getId());
+                }else {
+                    throw new CoolException("鍚屾澶辫触");
+                }
+            } catch (Exception e) {
+                log.error("鍚屾ERP澶辫触锛屾棩蹇桰D锛�" + changelog.getId(), e);
+            }
+        }
+    }
+    /**
+     * 妫�鏌ュ壇琛� man_order_detl_erp 鏄惁宸茬粡瀛樺湪姝よ褰�
+     */
+    private boolean checkIfExistsInErp(OrderDetl item) {
+        String checkSql = "SELECT * FROM man_order_detl_erp WHERE order_no = '" + escapeSql(item.getOrderNo()) + "' AND " +
+                "out_order_no = '" + escapeSql(item.getOutOrderNo()) + "' AND " +
+                "matnr = '" + escapeSql(item.getMatnr()) + "'";
+        List<Map<String, Object>> result = erpSqlServer.select(checkSql);  // 浣跨敤 ErpSqlServer 鏌ヨ鍓〃鏄惁宸叉湁璁板綍
+        if (result != null && !result.isEmpty()) {
+            return result.size() > 0;
+        }
+        return false;
+    }
+
+    /**
+     * 鎻掑叆鏁版嵁鍒板壇琛� man_order_detl_erp
+     */
+    private void insertIntoErp(OrderDetl item) {
+        Map<String, Object> content = locDetlToMap(item);  // 灏嗕富琛ㄥ疄浣撹浆鎹负Map
+        String insertSql = buildInsertSql("man_order_detl_erp", content);
+        if (erpSqlServer.update(insertSql) > 0) {
+            log.info("鍚屾ERP鎻掑叆鎴愬姛: orderNo={}, matnr={}", item.getOrderNo(), item.getMatnr());
+        } else {
+            log.info("鍚屾ERP鎻掑叆澶辫触: orderNo={}, matnr={}", item.getOrderNo(), item.getMatnr());
+        }
+    }
+
+    /**
+     * 鎷兼帴 INSERT SQL
+     */
+    private String buildInsertSql(String tableName, Map<String, Object> content) {
+        StringBuilder columns = new StringBuilder();
+        StringBuilder values = new StringBuilder();
+        content.forEach((k, v) -> {
+            columns.append("[").append(k).append("],");
+            values.append(toSqlValue(v)).append(",");
+        });
+        columns.deleteCharAt(columns.length() - 1);  // 鍘绘帀鏈�鍚庨�楀彿
+        values.deleteCharAt(values.length() - 1);  // 鍘绘帀鏈�鍚庨�楀彿
+
+        return "INSERT INTO " + tableName + " (" + columns + ") VALUES (" + values + ")";
+    }
+    /** 鎷兼帴 UPDATE SQL */
+    private String buildUpdateSql(String tableName, Map<String, Object> content, String whereClause) {
+        StringBuilder setSql = new StringBuilder();
+        content.forEach((k, v) -> {
+            setSql.append(k).append("=").append(toSqlValue(v)).append(",");
+        });
+        setSql.deleteCharAt(setSql.length() - 1);
+        return "UPDATE " + tableName + " SET " + setSql + " WHERE " + whereClause;
+    }
+    /** JSON 杞疄浣� */
+    private OrderDetl parseJsonToItem(String dataJson) {
+        return JSON.parseObject(dataJson, OrderDetl.class);
+    }
+    /** 杞崲涓� SQL 鍙敤鐨勫�� */
+    private String toSqlValue(Object value) {
+        if (value == null) return "NULL";
+        if (value instanceof String) return "'" + escapeSql((String) value) + "'";
+        if (value instanceof Date) return "'" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) value) + "'";
+        return value.toString();
+    }
+
+    /** SQL 娉ㄥ叆绠�鍗曡浆涔� */
+    private String escapeSql(String str) {
+        if (str == null) return "";
+        return str.replace("'", "''");
+    }
+    /** 瀹炰綋杞� Map */
+    private Map<String, Object> locDetlToMap(OrderDetl item) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("order_no", item.getOrderNo());
+        map.put("out_order_no", item.getOutOrderNo());
+        map.put("matnr", item.getMatnr());
+        map.put("anfme",item.getAnfme());
+        map.put("qty",item.getQty());
+        map.put("maktx", item.getMaktx());
+        map.put("batch", item.getBatch());
+        map.put("specs", item.getSpecs());
+        map.put("model", item.getModel());
+        map.put("color", item.getColor());
+        map.put("brand", item.getBrand());
+        map.put("unit", item.getUnit());
+        map.put("price", item.getPrice());
+        map.put("sku", item.getSku());
+        map.put("units", item.getUnits());
+        map.put("barcode", item.getBarcode());
+        map.put("origin", item.getOrigin());
+        map.put("manu", item.getManu());
+        map.put("manu_date", item.getManuDate());
+        map.put("item_num", item.getItemNum());
+        map.put("safe_qty", item.getSafeQty());
+        map.put("weight", item.getWeight());
+        map.put("length", item.getLength());
+        map.put("volume", item.getVolume());
+        map.put("three_code", item.getThreeCode());
+        map.put("supp", item.getSupp());
+        map.put("supp_code", item.getSuppCode());
+        map.put("be_batch", item.getBeBatch());
+        map.put("dead_time", item.getDeadTime());
+        map.put("dead_warn", item.getDeadWarn());
+        map.put("source", item.getSource());
+        map.put("inspect", item.getInspect());
+        map.put("danger", item.getDanger());
+        map.put("status", item.getStatus());
+        map.put("create_by", item.getCreateBy());
+        map.put("create_time", item.getCreateTime());
+        map.put("update_by", item.getUpdateBy());
+        map.put("update_time", item.getUpdateTime());
+        map.put("memo", item.getMemo());
+        map.put("work_qty", item.getWorkQty());
+        map.put("auto_id", item.getAutoId());
+        map.put("lu_hao", item.getLuHao());
+        map.put("temp1", item.getTemp1());
+        map.put("temp2", item.getTemp2());
+        map.put("temp3", item.getTemp3());
+        map.put("ware_id", item.getWareId());
+        map.put("ware_name", item.getWareName());
+        map.put("packing", item.getPacking());
+        map.put("i_no", item.getINo());
+        map.put("pro_type", item.getProType());
+        return map;
+    }
+
+}
diff --git a/src/main/java/orderDetlChangelog.sql b/src/main/java/orderDetlChangelog.sql
new file mode 100644
index 0000000..548d0fc
--- /dev/null
+++ b/src/main/java/orderDetlChangelog.sql
@@ -0,0 +1,18 @@
+-- save orderDetlChangelog record
+-- mysql
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'orderDetlChangelog/orderDetlChangelog.html', 'orderDetlChangelog绠$悊', null , '2', null , '1');
+
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'orderDetlChangelog#view', '鏌ヨ', '', '3', '0', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'orderDetlChangelog#btn-add', '鏂板', '', '3', '1', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'orderDetlChangelog#btn-edit', '缂栬緫', '', '3', '2', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'orderDetlChangelog#btn-delete', '鍒犻櫎', '', '3', '3', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'orderDetlChangelog#btn-export', '瀵煎嚭', '', '3', '4', '1');
+
+-- sqlserver
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'orderDetlChangelog/orderDetlChangelog.html', N'orderDetlChangelog绠$悊', null, '2', null, '1');
+
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'orderDetlChangelog#view', N'鏌ヨ', '', '3', '0', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'orderDetlChangelog#btn-add', N'鏂板', '', '3', '1', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'orderDetlChangelog#btn-edit', N'缂栬緫', '', '3', '2', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'orderDetlChangelog#btn-delete', N'鍒犻櫎', '', '3', '3', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'orderDetlChangelog#btn-export', N'瀵煎嚭', '', '3', '4', '1');
diff --git a/src/main/resources/mapper/OrderDetlChangelogMapper.xml b/src/main/resources/mapper/OrderDetlChangelogMapper.xml
new file mode 100644
index 0000000..fecf55b
--- /dev/null
+++ b/src/main/resources/mapper/OrderDetlChangelogMapper.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.mapper.OrderDetlChangelogMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.OrderDetlChangelog">
+        <result column="id" property="id" />
+        <result column="action_type" property="actionType" />
+        <result column="order_no" property="orderNo" />
+        <result column="matnr" property="matnr" />
+        <result column="data" property="data" />
+        <result column="change_time" property="changeTime" />
+        <result column="processed" property="processed" />
+
+    </resultMap>
+    <select id="selectUnprocessedLogs" resultMap="BaseResultMap">
+    SELECT *
+    FROM man_order_detl_changelog
+    WHERE processed = 0
+    ORDER BY id
+    </select>
+
+    <update id="markProcessed">
+    UPDATE man_order_detl_changelog
+    SET processed = 1
+    WHERE id = #{id}
+    </update>
+</mapper>
diff --git a/src/main/webapp/static/js/orderDetlChangelog/orderDetlChangelog.js b/src/main/webapp/static/js/orderDetlChangelog/orderDetlChangelog.js
new file mode 100644
index 0000000..c7b50c7
--- /dev/null
+++ b/src/main/webapp/static/js/orderDetlChangelog/orderDetlChangelog.js
@@ -0,0 +1,256 @@
+var pageCurr;
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).use(['table','laydate', 'form', 'admin'], function(){
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+    var admin = layui.admin;
+
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#orderDetlChangelog',
+        headers: {token: localStorage.getItem('token')},
+        url: baseUrl+'/orderDetlChangelog/list/auth',
+        page: true,
+        limit: 15,
+        limits: [15, 30, 50, 100, 200, 500],
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        height: 'full-120',
+        cols: [[
+            {type: 'checkbox'}
+            ,{field: 'id', align: 'center',title: ''}
+            ,{field: 'actionType', align: 'center',title: ''}
+            ,{field: 'orderNo', align: 'center',title: ''}
+            ,{field: 'matnr', align: 'center',title: ''}
+            ,{field: 'data', align: 'center',title: ''}
+            ,{field: 'changeTime$', align: 'center',title: ''}
+            ,{field: 'processed', align: 'center',title: ''}
+
+            ,{fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width:120}
+        ]],
+        request: {
+            pageName: 'curr',
+            pageSize: 'limit'
+        },
+        parseData: function (res) {
+            return {
+                'code': res.code,
+                'msg': res.msg,
+                'count': res.data.total,
+                'data': res.data.records
+            }
+        },
+        response: {
+            statusCode: 200
+        },
+        done: function(res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;
+            limit();
+        }
+    });
+
+    // 鐩戝惉鎺掑簭浜嬩欢
+    table.on('sort(orderDetlChangelog)', function (obj) {
+        var searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function() {
+            searchData[this.name] = this.value;
+        });
+        searchData['orderByField'] = obj.field;
+        searchData['orderByType'] = obj.type;
+        tableIns.reload({
+            where: searchData,
+            page: {curr: 1}
+        });
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(orderDetlChangelog)', function (obj) {
+        var checkStatus = table.checkStatus(obj.config.id).data;
+        switch(obj.event) {
+            case 'addData':
+                showEditModel();
+                break;
+            case 'deleteData':
+               if (checkStatus.length === 0) {
+                   layer.msg('璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁', {icon: 2});
+                   return;
+               }
+               del(checkStatus.map(function (d) {
+                   return d.id;
+               }));
+               break;
+            case 'exportData':
+                admin.confirm('纭畾瀵煎嚭Excel鍚�', {shadeClose: true}, function(){
+                    var titles=[];
+                    var fields=[];
+                    obj.config.cols[0].map(function (col) {
+                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
+                            titles.push(col.title);
+                            fields.push(col.field);
+                        }
+                    });
+                    var exportData = {};
+                    $.each($('#search-box [name]').serializeArray(), function() {
+                        exportData[this.name] = this.value;
+                    });
+                    var param = {
+                        'orderDetlChangelog': exportData,
+                        'fields': fields
+                    };
+                    $.ajax({
+                        url: baseUrl+"/orderDetlChangelog/export/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: JSON.stringify(param),
+                        dataType:'json',
+                        contentType:'application/json;charset=UTF-8',
+                        method: 'POST',
+                        success: function (res) {
+                            layer.closeAll();
+                            if (res.code === 200) {
+                                table.exportFile(titles,res.data,'xls');
+                            } else if (res.code === 403) {
+                                top.location.href = baseUrl+"/";
+                            } else {
+                                layer.msg(res.msg, {icon: 2})
+                            }
+                        }
+                    });
+                });
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(orderDetlChangelog)', function(obj){
+        var data = obj.data;
+        switch (obj.event) {
+            case 'edit':
+                showEditModel(data);
+                break;
+            case "del":
+                del([data.id]);
+                break;
+        }
+    });
+
+    /* 寮圭獥 - 鏂板銆佷慨鏀� */
+    function showEditModel(mData) {
+        admin.open({
+            type: 1,
+            area: '600px',
+            title: (mData ? '淇敼' : '娣诲姞') + '璁㈠崟鐘舵��',
+            content: $('#editDialog').html(),
+            success: function (layero, dIndex) {
+                layDateRender(mData);
+                form.val('detail', mData);
+                form.on('submit(editSubmit)', function (data) {
+                    var loadIndex = layer.load(2);
+                    $.ajax({
+                        url: baseUrl+"/orderDetlChangelog/"+(mData?'update':'add')+"/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: data.field,
+                        method: 'POST',
+                        success: function (res) {
+                            layer.close(loadIndex);
+                            if (res.code === 200){
+                                layer.close(dIndex);
+                                layer.msg(res.msg, {icon: 1});
+                                tableReload();
+                            } else if (res.code === 403){
+                                top.location.href = baseUrl+"/";
+                            }else {
+                                layer.msg(res.msg, {icon: 2});
+                            }
+                        }
+                    })
+                    return false;
+                });
+                $(layero).children('.layui-layer-content').css('overflow', 'visible');
+                layui.form.render('select');
+            }
+        });
+    }
+
+    /* 鍒犻櫎 */
+    function del(ids) {
+        layer.confirm('纭畾瑕佸垹闄ら�変腑鏁版嵁鍚楋紵', {
+            skin: 'layui-layer-admin',
+            shade: .1
+        }, function (i) {
+            layer.close(i);
+            var loadIndex = layer.load(2);
+            $.ajax({
+                url: baseUrl+"/orderDetlChangelog/delete/auth",
+                headers: {'token': localStorage.getItem('token')},
+                data: {ids: ids},
+                method: 'POST',
+                success: function (res) {
+                    layer.close(loadIndex);
+                    if (res.code === 200){
+                        layer.msg(res.msg, {icon: 1});
+                        tableReload();
+                    } else if (res.code === 403){
+                        top.location.href = baseUrl+"/";
+                    } else {
+                        layer.msg(res.msg, {icon: 2});
+                    }
+                }
+            })
+        });
+    }
+
+    // 鎼滅储
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        tableReload(false);
+    });
+
+    // 閲嶇疆
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        tableReload(false);
+    });
+
+    // 鏃堕棿閫夋嫨鍣�
+    function layDateRender(data) {
+        setTimeout(function () {
+            layDate.render({
+                elem: '.layui-laydate-range'
+                ,type: 'datetime'
+                ,range: true
+            });
+            layDate.render({
+                elem: '#changeTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['changeTime\\$']:null
+            });
+
+        }, 300);
+    }
+    layDateRender();
+
+});
+
+// 鍏抽棴鍔ㄤ綔
+$(document).on('click','#data-detail-close', function () {
+    parent.layer.closeAll();
+});
+
+function tableReload(child) {
+    var searchData = {};
+    $.each($('#search-box [name]').serializeArray(), function() {
+        searchData[this.name] = this.value;
+    });
+    tableIns.reload({
+        where: searchData,
+        page: {curr: pageCurr}
+     });
+}
diff --git a/src/main/webapp/views/orderDetlChangelog/orderDetlChangelog.html b/src/main/webapp/views/orderDetlChangelog/orderDetlChangelog.html
new file mode 100644
index 0000000..bcbc584
--- /dev/null
+++ b/src/main/webapp/views/orderDetlChangelog/orderDetlChangelog.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body">
+            <div class="layui-form toolbar" id="search-box">
+                <div class="layui-form-item">
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="id" placeholder="缂栧彿" autocomplete="off">
+                        </div>
+                    </div>
+                     <div class="layui-inline" style="width: 300px">
+                        <div class="layui-input-inline">
+                            <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="璧峰鏃堕棿 - 缁堟鏃堕棿" autocomplete="off" style="width: 300px">
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="condition" placeholder="璇疯緭鍏�" autocomplete="off">
+                        </div>
+                    </div>
+                    <div class="layui-inline">&emsp;
+                        <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
+                            <i class="layui-icon">&#xe615;</i>鎼滅储
+                        </button>
+                        <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
+                            <i class="layui-icon">&#xe666;</i>閲嶇疆
+                        </button>
+                    </div>
+                </div>
+            </div>
+            <table class="layui-hide" id="orderDetlChangelog" lay-filter="orderDetlChangelog"></table>
+        </div>
+    </div>
+</div>
+
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">鏂板</button>
+        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">鍒犻櫎</button>
+        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">瀵煎嚭</button>
+    </div>
+</script>
+
+<script type="text/html" id="operate">
+    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">淇敼</a>
+    <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">鍒犻櫎</a>
+</script>
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/orderDetlChangelog/orderDetlChangelog.js" charset="utf-8"></script>
+</body>
+<!-- 琛ㄥ崟寮圭獥 -->
+<script type="text/html" id="editDialog">
+    <form id="detail" lay-filter="detail" class="layui-form admin-form model-form">
+        <input name="id" type="hidden">
+        <div class="layui-row">
+            <div class="layui-col-md12">
+                <div class="layui-form-item">
+                    <label class="layui-form-label">: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="actionType" placeholder="璇疯緭鍏�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="orderNo" placeholder="璇疯緭鍏�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="matnr" placeholder="璇疯緭鍏�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="data" placeholder="璇疯緭鍏�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="changeTime" id="changeTime$" placeholder="璇疯緭鍏�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="processed" placeholder="璇疯緭鍏�">
+                    </div>
+                </div>
+
+             </div>
+        </div>
+        <hr class="layui-bg-gray">
+        <div class="layui-form-item text-right">
+            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">淇濆瓨</button>
+            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">鍙栨秷</button>
+        </div>
+    </form>
+</script>
+</html>
+

--
Gitblit v1.9.1