From a4d797eb5af29200c9706b4c35c9bf23777c8c17 Mon Sep 17 00:00:00 2001
From: zhang <zc857179121@qq.com>
Date: 星期五, 01 八月 2025 12:55:23 +0800
Subject: [PATCH] 1

---
 src/main/java/com/zy/asrs/service/impl/ReviewDetlServiceImpl.java   |   24 
 src/main/java/com/zy/asrs/service/impl/ReviewServiceImpl.java       |   19 
 src/main/java/com/zy/asrs/service/ReviewService.java                |   12 
 src/main/java/com/zy/asrs/controller/ReviewController.java          |  116 ++
 src/main/java/com/zy/asrs/task/OrderMoveHistoryScheduler.java       |    8 
 src/main/webapp/views/review/review.html                            |  389 ++++++++
 src/main/java/com/zy/asrs/importexcle/ImportReviewListener.java     |  162 +++
 src/main/java/com/zy/asrs/mapper/ReviewMapper.java                  |   18 
 src/main/webapp/static/js/review/review.js                          |  839 +++++++++++++++++++
 src/main/java/com/zy/asrs/entity/Review.java                        |  344 +++++++
 src/main/resources/mapper/ReviewMapper.xml                          |   14 
 src/main/java/com/zy/asrs/importexcle/ImportReviewDto.java          |   28 
 src/main/java/com/zy/asrs/task/handler/OrderMoveHistoryHandler.java |   55 +
 src/main/resources/mapper/ReviewDetlMapper.xml                      |   12 
 src/main/java/com/zy/asrs/entity/ReviewDetl.java                    |  386 ++++++++
 src/main/java/com/zy/asrs/mapper/ReviewDetlMapper.java              |   19 
 src/main/java/com/zy/asrs/service/ReviewDetlService.java            |   14 
 src/main/java/com/zy/asrs/controller/ReviewDetlController.java      |  132 +++
 18 files changed, 2,584 insertions(+), 7 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/ReviewController.java b/src/main/java/com/zy/asrs/controller/ReviewController.java
new file mode 100644
index 0000000..5d44631
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/ReviewController.java
@@ -0,0 +1,116 @@
+package com.zy.asrs.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.core.annotations.ManagerAuth;
+import com.core.common.Cools;
+import com.core.common.DateUtils;
+import com.core.common.R;
+import com.core.common.SnowflakeIdWorker;
+import com.core.exception.CoolException;
+import com.zy.asrs.entity.Review;
+import com.zy.asrs.importexcle.ImportReviewDto;
+import com.zy.asrs.importexcle.ImportReviewListener;
+import com.zy.asrs.mapper.ReviewDetlMapper;
+import com.zy.asrs.service.ReviewDetlService;
+import com.zy.asrs.service.ReviewService;
+import com.zy.common.web.BaseController;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.util.Date;
+import java.util.Map;
+
+@RestController
+public class ReviewController extends BaseController {
+
+    @Autowired
+    private ReviewService reviewService;
+    @Autowired
+    private ReviewDetlService reviewDetlService;
+    @Autowired
+    private SnowflakeIdWorker snowflakeIdWorker;
+
+    @Resource
+    private ReviewDetlMapper reviewDetlMapper;
+
+    @PostMapping("/importReview")
+    @ManagerAuth(memo = "鍗曟嵁瀵煎叆")
+    @ApiOperation(value = "鍗曟嵁瀵煎叆", produces = MediaType.APPLICATION_JSON_VALUE)
+    public R importOrderData(@RequestParam("file") MultipartFile multipartFile) {
+        try {
+            importOrder(multipartFile);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error(e.getMessage());
+        }
+        return R.ok("瀵煎叆鎴愬姛");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void importOrder(MultipartFile multipartFile) throws IOException {
+        // 鑰冩牳鏁版嵁鐨勫垽閲嶄娇鐢╫rder_id,check_type鐨勭粍鍚堝敮涓�绱㈠紩瑙e喅
+        EasyExcel.read(multipartFile.getInputStream(), ImportReviewDto.class,
+                new ImportReviewListener(snowflakeIdWorker, getUserId())).sheet().doReadSync();
+    }
+
+
+    @RequestMapping(value = "/review/head/page/auth")
+    @ManagerAuth
+    public R head(@RequestParam(defaultValue = "1") Integer curr,
+                  @RequestParam(defaultValue = "10") Integer limit,
+                  @RequestParam(required = false) String orderByField,
+                  @RequestParam(required = false) String orderByType,
+                  @RequestParam Map<String, Object> param) {
+        EntityWrapper<Review> wrapper = new EntityWrapper<>();
+        excludeTrash(param);
+        convert(param, wrapper);
+        if (!Cools.isEmpty(orderByField)) {
+            wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));
+        } else {
+            wrapper.orderBy("settle").orderBy("create_time", false);
+        }
+        wrapper.eq("status", 1);
+        return R.ok(reviewService.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 = "/review/update/auth")
+    @ManagerAuth
+    public R update(Review review) {
+        if (Cools.isEmpty(review) || null == review.getId()) {
+            return R.error();
+        }
+        Review review2 = reviewService.selectById(review.getId());
+        review2.setSettle(review.getSettle());
+        review.setUpdateBy(getUserId());
+        review.setUpdateTime(new Date());
+        if (!reviewService.updateById(review)) {
+            throw new CoolException("淇敼澶辫触");
+        }
+        return R.ok();
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/controller/ReviewDetlController.java b/src/main/java/com/zy/asrs/controller/ReviewDetlController.java
new file mode 100644
index 0000000..5e0080d
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/ReviewDetlController.java
@@ -0,0 +1,132 @@
+package com.zy.asrs.controller;
+
+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.annotations.ManagerAuth;
+import com.core.common.BaseRes;
+import com.core.common.Cools;
+import com.core.common.DateUtils;
+import com.core.common.R;
+import com.zy.asrs.entity.ReviewDetl;
+import com.zy.asrs.service.ReviewDetlService;
+import com.zy.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+public class ReviewDetlController extends BaseController {
+
+    @Autowired
+    private ReviewDetlService reviewDetlService;
+
+    @RequestMapping(value = "/reviewDetl/{id}/auth")
+    @ManagerAuth
+    public R get(@PathVariable("id") String id) {
+        return R.ok(reviewDetlService.selectById(String.valueOf(id)));
+    }
+
+    @RequestMapping(value = "/reviewDetl/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 Map<String, Object> param) {
+        EntityWrapper<ReviewDetl> wrapper = new EntityWrapper<>();
+        excludeTrash(param);
+        convert(param, wrapper);
+        if (!Cools.isEmpty(orderByField)) {
+            wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));
+        } else {
+            wrapper.orderBy("create_time", false);
+        }
+        wrapper.eq("status", 1);
+        Page<ReviewDetl> reviewDetlPage = reviewDetlService.selectPage(new Page<>(curr, limit), wrapper);
+        return R.ok(reviewDetlPage);
+    }
+
+
+    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 = "/reviewDetl/add/auth")
+    @ManagerAuth
+    public R add(ReviewDetl reviewDetl) {
+        reviewDetlService.insert(reviewDetl);
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/reviewDetl/update/auth")
+    @ManagerAuth
+    public R update(ReviewDetl reviewDetl) {
+        if (Cools.isEmpty(reviewDetl) || null == reviewDetl.getId()) {
+            return R.error();
+        }
+        reviewDetlService.updateById(reviewDetl);
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/reviewDetl/delete/auth")
+    @ManagerAuth
+    public R delete(@RequestParam(value = "ids[]") Long[] ids) {
+        for (Long id : ids) {
+            reviewDetlService.deleteById(id);
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/reviewDetl/export/auth")
+    @ManagerAuth
+    public R export(@RequestBody JSONObject param) {
+        EntityWrapper<ReviewDetl> wrapper = new EntityWrapper<>();
+        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
+        Map<String, Object> map = excludeTrash(param.getJSONObject("reviewDetl"));
+        convert(map, wrapper);
+        List<ReviewDetl> list = reviewDetlService.selectList(wrapper);
+        return R.ok(exportSupport(list, fields));
+    }
+
+    @RequestMapping(value = "/reviewDetlQuery/auth")
+    @ManagerAuth
+    public R query(String condition) {
+        EntityWrapper<ReviewDetl> wrapper = new EntityWrapper<>();
+        wrapper.like("id", condition);
+        Page<ReviewDetl> page = reviewDetlService.selectPage(new Page<>(0, 10), wrapper);
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (ReviewDetl reviewDetl : page.getRecords()) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", reviewDetl.getId());
+            map.put("value", reviewDetl.getId());
+            result.add(map);
+        }
+        return R.ok(result);
+    }
+
+    @RequestMapping(value = "/reviewDetl/check/column/auth")
+    @ManagerAuth
+    public R query(@RequestBody JSONObject param) {
+        Wrapper<ReviewDetl> wrapper = new EntityWrapper<ReviewDetl>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
+        if (null != reviewDetlService.selectOne(wrapper)) {
+            return R.parse(BaseRes.REPEAT).add(getComment(ReviewDetl.class, String.valueOf(param.get("key"))));
+        }
+        return R.ok();
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/Review.java b/src/main/java/com/zy/asrs/entity/Review.java
new file mode 100644
index 0000000..e1a0d61
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/Review.java
@@ -0,0 +1,344 @@
+package com.zy.asrs.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.service.DocTypeService;
+import com.zy.asrs.service.OrderSettleService;
+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_review")
+public class Review implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value = "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 缂栧彿
+     */
+    @ApiModelProperty(value = "缂栧彿")
+    private String uuid;
+
+    /**
+     * 璁㈠崟缂栧彿
+     */
+    @ApiModelProperty(value = "璁㈠崟缂栧彿")
+    @TableField("order_no")
+    private String orderNo;
+
+    /**
+     * 鍗曟嵁鏃ユ湡
+     */
+    @ApiModelProperty(value = "鍗曟嵁鏃ユ湡")
+    @TableField("order_time")
+    private String orderTime;
+
+    /**
+     * 鍗曟嵁绫诲瀷
+     */
+    @ApiModelProperty(value = "鍗曟嵁绫诲瀷")
+    @TableField("doc_type")
+    private Long docType;
+
+    /**
+     * 椤圭洰缂栧彿
+     */
+    @ApiModelProperty(value = "椤圭洰缂栧彿")
+    @TableField("item_id")
+    private Long itemId;
+
+    @ApiModelProperty(value = "")
+    @TableField("item_name")
+    private String itemName;
+
+    /**
+     * 璋冩嫧椤圭洰缂栧彿
+     */
+    @ApiModelProperty(value = "璋冩嫧椤圭洰缂栧彿")
+    @TableField("allot_item_id")
+    private Long allotItemId;
+
+    /**
+     * 鍒濆绁ㄦ嵁鍙�
+     */
+    @ApiModelProperty(value = "鍒濆绁ㄦ嵁鍙�")
+    @TableField("def_number")
+    private String defNumber;
+
+    /**
+     * 绁ㄦ嵁鍙�
+     */
+    @ApiModelProperty(value = "绁ㄦ嵁鍙�")
+    private String number;
+
+    /**
+     * 瀹㈡埛缂栧彿
+     */
+    @ApiModelProperty(value = "瀹㈡埛缂栧彿")
+    private Long cstmr;
+
+    /**
+     * 瀹㈡埛
+     */
+    @ApiModelProperty(value = "瀹㈡埛")
+    @TableField("cstmr_name")
+    private String cstmrName;
+
+    /**
+     * 鑱旂郴鏂瑰紡
+     */
+    @ApiModelProperty(value = "鑱旂郴鏂瑰紡")
+    private String tel;
+
+    /**
+     * 鎿嶄綔浜哄憳
+     */
+    @ApiModelProperty(value = "鎿嶄綔浜哄憳")
+    @TableField("oper_memb")
+    private String operMemb;
+
+    /**
+     * 鍚堣閲戦
+     */
+    @ApiModelProperty(value = "鍚堣閲戦")
+    @TableField("total_fee")
+    private Double totalFee;
+
+    /**
+     * 浼樻儬鐜�
+     */
+    @ApiModelProperty(value = "浼樻儬鐜�")
+    private Double discount;
+
+    /**
+     * 浼樻儬閲戦
+     */
+    @ApiModelProperty(value = "浼樻儬閲戦")
+    @TableField("discount_fee")
+    private Double discountFee;
+
+    /**
+     * 閿�鍞垨閲囪喘璐圭敤鍚堣
+     */
+    @ApiModelProperty(value = "閿�鍞垨閲囪喘璐圭敤鍚堣")
+    @TableField("other_fee")
+    private Double otherFee;
+
+    /**
+     * 瀹炰粯閲戦
+     */
+    @ApiModelProperty(value = "瀹炰粯閲戦")
+    @TableField("act_fee")
+    private Double actFee;
+
+    /**
+     * 浠樻绫诲瀷 1: 鐜伴噾  2: 璁拌处
+     */
+    @ApiModelProperty(value = "浠樻绫诲瀷 1: 鐜伴噾  2: 璁拌处  ")
+    @TableField("pay_type")
+    private Integer payType;
+
+    /**
+     * 涓氬姟鍛�
+     */
+    @ApiModelProperty(value = "涓氬姟鍛�")
+    private String salesman;
+
+    /**
+     * 缁撶畻澶╂暟
+     */
+    @ApiModelProperty(value = "缁撶畻澶╂暟")
+    @TableField("account_day")
+    private Integer accountDay;
+
+    /**
+     * 閭垂鏀粯绫诲瀷 1: 鍦ㄧ嚎鏀粯  2: 璐у埌浠樻
+     */
+    @ApiModelProperty(value = "閭垂鏀粯绫诲瀷 1: 鍦ㄧ嚎鏀粯  2: 璐у埌浠樻  ")
+    @TableField("post_fee_type")
+    private Integer postFeeType;
+
+    /**
+     * 閭垂
+     */
+    @ApiModelProperty(value = "閭垂")
+    @TableField("post_fee")
+    private Double postFee;
+
+    /**
+     * 浠樻鏃堕棿
+     */
+    @ApiModelProperty(value = "浠樻鏃堕棿")
+    @TableField("pay_time")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date payTime;
+
+    /**
+     * 鍙戣揣鏃堕棿
+     */
+    @ApiModelProperty(value = "鍙戣揣鏃堕棿")
+    @TableField("send_time")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date sendTime;
+
+    /**
+     * 鐗╂祦鍚嶇О
+     */
+    @ApiModelProperty(value = "鐗╂祦鍚嶇О")
+    @TableField("ship_name")
+    private String shipName;
+
+    /**
+     * 鐗╂祦鍗曞彿
+     */
+    @ApiModelProperty(value = "鐗╂祦鍗曞彿")
+    @TableField("ship_code")
+    private String shipCode;
+
+    /**
+     * 璁㈠崟鐘舵��
+     */
+    @ApiModelProperty(value = "璁㈠崟鐘舵��")
+    private Long settle;
+
+    /**
+     * 鐘舵�� 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;
+
+
+    public String getPayTime$() {
+        if (Cools.isEmpty(this.payTime)) {
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.payTime);
+    }
+
+    public String getSendTime$() {
+        if (Cools.isEmpty(this.sendTime)) {
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.sendTime);
+    }
+
+    public String getSettle$() {
+        OrderSettleService service = SpringUtils.getBean(OrderSettleService.class);
+        OrderSettle orderSettle = service.selectById(this.settle);
+        if (!Cools.isEmpty(orderSettle)) {
+            return String.valueOf(orderSettle.getSettleName());
+        }
+        return null;
+    }
+
+    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 String getTkType() {
+        DocTypeService service = SpringUtils.getBean(DocTypeService.class);
+        DocType docType = service.selectById(this.docType);
+        if (!Cools.isEmpty(docType)) {
+            return docType.getPakout().toString();
+        }
+        return "0";
+    }
+
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/ReviewDetl.java b/src/main/java/com/zy/asrs/entity/ReviewDetl.java
new file mode 100644
index 0000000..5f667aa
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/ReviewDetl.java
@@ -0,0 +1,386 @@
+package com.zy.asrs.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.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.core.common.Cools;
+import com.core.common.SpringUtils;
+import com.zy.asrs.service.BasBoxTypeService;
+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_review_detl")
+public class ReviewDetl 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;
+
+    /**
+     * 浣滀笟鏁伴噺
+     *
+     *  鍏ュ簱 : 缁勬墭瀹屾垚锛岀粍鎵樻。銆佸伐浣滄。銆佸叆搴撳畬鎴愭暟閲�
+     *  鍑哄簱 : 宸ヤ綔妗c�佸嚭搴撳畬鎴愭暟閲�
+     */
+    @ApiModelProperty(value= "浣滀笟鏁伴噺")
+    @TableField("work_qty")
+    private Double workQty;
+
+    /**
+     * 瀹屾垚鏁伴噺
+     *
+     *  鍏ュ簱 : 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;
+
+    @ApiModelProperty(value = "閫�搴撴爣璁�")
+    @TableField("tk_type")
+    private Integer tkType;
+
+    /**
+     * 鍗蜂俊鎭疘D
+     */
+    @ApiModelProperty(value= "鍗蜂俊鎭疘D")
+    @TableField("roll_up")
+    private Long rollUp;
+
+
+    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 String getQty$(){
+        if (getAnfme().equals(getQty())){
+            return "宸插畬鎴�";
+        }
+        return "鏈畬鎴�";
+    }
+
+    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 void sync(Object source) {
+        Synchro.Copy(source, this);
+    }
+
+    public String getBrand$(){
+        BasBoxTypeService basBoxTypeService = SpringUtils.getBean(BasBoxTypeService.class);
+        BasBoxType basBoxType = basBoxTypeService.selectOne(new EntityWrapper<BasBoxType>().eq("box_type", this.brand));
+        if (!Cools.isEmpty(basBoxType)){
+            return String.valueOf(basBoxType.getBoxSpecs());
+        }
+        return this.brand;
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/zy/asrs/importexcle/ImportReviewDto.java b/src/main/java/com/zy/asrs/importexcle/ImportReviewDto.java
new file mode 100644
index 0000000..61d986e
--- /dev/null
+++ b/src/main/java/com/zy/asrs/importexcle/ImportReviewDto.java
@@ -0,0 +1,28 @@
+package com.zy.asrs.importexcle;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+/**
+ * @author pang.jiabao
+ * @description 瀵煎叆璁㈠崟dto
+ * @createDate 2024/9/2 9:55
+ */
+@Data
+public class ImportReviewDto {
+
+    @ExcelProperty(value = "鍖呰缁勫彿/婧愬簱浣�",index = 0)
+    private String column1;
+
+    @ExcelProperty(value = "鍑哄簱鍗曞彿/鍗曟嵁绫诲瀷/瀹㈡埛鍚嶇О/澶囨敞/鐩爣搴撲綅",index = 1)
+    private String column2;
+
+    @ExcelProperty(value = "鐩爣宸烽亾/瀹㈡埛鍚嶇О",index = 2)
+    private String column3;
+
+    @ExcelProperty(value = "澶囨敞",index = 3)
+    private String column4;
+
+
+
+}
diff --git a/src/main/java/com/zy/asrs/importexcle/ImportReviewListener.java b/src/main/java/com/zy/asrs/importexcle/ImportReviewListener.java
new file mode 100644
index 0000000..43991df
--- /dev/null
+++ b/src/main/java/com/zy/asrs/importexcle/ImportReviewListener.java
@@ -0,0 +1,162 @@
+package com.zy.asrs.importexcle;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.fastjson.JSON;
+import com.core.common.Cools;
+import com.core.common.SnowflakeIdWorker;
+import com.zy.asrs.entity.OrderDetl;
+import com.zy.asrs.service.ReviewDetlService;
+import com.zy.asrs.service.ReviewService;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.*;
+
+/**
+ * @author pang.jiabao
+ * @description 瀵煎叆璁㈠崟鐩戝惉鍣�
+ * @createDate 2024/9/2 9:56
+ */
+@Slf4j
+public class ImportReviewListener extends AnalysisEventListener<ImportReviewDto> {
+    /**
+     * 姣忛殧1000鏉″瓨鍌ㄦ暟鎹簱锛屽疄闄呬娇鐢ㄤ腑鍙互3000鏉★紝鐒跺悗娓呯悊list 锛屾柟渚垮唴瀛樺洖鏀�
+     */
+    private static final int BATCH_COUNT = 400;
+
+    private int count = 0;
+
+    private String orderNo;
+
+    private long orderId;
+
+    private long docTypeId;
+
+    List<ImportReviewDto> list = new ArrayList<>();
+    /**
+     * 鍋囪杩欎釜鏄竴涓狣AO锛屽綋鐒舵湁涓氬姟閫昏緫杩欎釜涔熷彲浠ユ槸涓�涓猻ervice銆傚綋鐒跺鏋滀笉鐢ㄥ瓨鍌ㄨ繖涓璞℃病鐢ㄣ��
+     */
+    private ReviewService reviewService;
+    private ReviewDetlService reviewDetlService;
+    private final SnowflakeIdWorker snowflakeIdWorker;
+    private final Long userId;
+
+    /**
+     * 濡傛灉浣跨敤浜唖pring,璇蜂娇鐢ㄨ繖涓瀯閫犳柟娉曘�傛瘡娆″垱寤篖istener鐨勬椂鍊欓渶瑕佹妸spring绠$悊鐨勭被浼犺繘鏉�
+     */
+    public ImportReviewListener(SnowflakeIdWorker snowflakeIdWorker, Long userId) {
+        this.snowflakeIdWorker = snowflakeIdWorker;
+        this.userId = userId;
+    }
+
+    private Set<String> uniquePackNos = new HashSet<>(); // 鐢ㄤ簬鍘婚噸鍖呰缁勫彿
+
+    @SneakyThrows
+    @Override
+    public void invoke(ImportReviewDto data, AnalysisContext context) {
+        log.info("瑙f瀽鍒扮 {} 鏉℃暟鎹�:{}", ++count, JSON.toJSONString(data));
+
+        // 鑾峰彇鍖呰缁勫彿锛坈olumn1锛�
+        String packNo = data.getColumn1();
+        if (Cools.isEmpty(packNo)) {
+            log.warn("鍖呰缁勫彿涓虹┖锛岃烦杩囪琛岋紒");
+            return;
+        }
+
+        // 濡傛灉宸茬粡澶勭悊杩囪鍖呰缁勫彿锛屽垯璺宠繃
+        if (uniquePackNos.contains(packNo)) {
+            log.info("閲嶅鐨勫寘瑁呯粍鍙凤細{}锛岃烦杩�", packNo);
+            return;
+        }
+
+        // 棣栨鍑虹幇锛岃褰曞苟澶勭悊
+        uniquePackNos.add(packNo);
+        list.add(data);
+
+        if (context.getCurrentRowNum() == 3) {
+
+            return;
+        }
+
+        if (list.size() >= BATCH_COUNT) {
+            saveData();
+            list.clear();
+        }
+    }
+
+
+    /**
+     * 鎵�鏈夋暟鎹В鏋愬畬鎴愪簡 閮戒細鏉ヨ皟鐢�
+     */
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        // 杩欓噷涔熻淇濆瓨鏁版嵁锛岀‘淇濇渶鍚庨仐鐣欑殑鏁版嵁涔熷瓨鍌ㄥ埌鏁版嵁搴�
+        if (list.size() > 0) {
+            saveData();
+        }
+        log.info("鎵�鏈夋暟鎹В鏋愬畬鎴愶紒");
+    }
+
+
+    private static final int MAX_BATCH_SIZE = 50; // 寤鸿 100~200锛屾牴鎹瓧娈垫暟鎺у埗
+
+    /**
+     * 鍒嗘壒瀛樺偍鏁版嵁搴擄紝閬垮厤SQL Server鍙傛暟涓婇檺锛�2100锛夐敊璇�
+     */
+    private void saveData() {
+        log.info("{}鏉℃暟鎹紝寮�濮嬪瓨鍌ㄦ暟鎹簱锛�", list.size());
+        log.info("鍗曟嵁鍙凤細{}锛屾暟鎹細{},", orderNo, JSON.toJSONString(list));
+
+        List<OrderDetl> orderDetlList = new ArrayList<>();
+        for (ImportReviewDto importOrderDto : list) {
+            OrderDetl orderDetl = new OrderDetl();
+
+            if (docTypeId == 24) {
+                orderDetl.setSpecs(String.format("%07d", Integer.parseInt(importOrderDto.getColumn1()))); // 婧愬簱浣�
+                if (importOrderDto.getColumn2() != null) {
+                    orderDetl.setModel(String.format("%07d", Integer.parseInt(importOrderDto.getColumn2()))); // 鐩爣搴撲綅
+                }
+                if (importOrderDto.getColumn3() != null) {
+                    orderDetl.setBeBatch(Integer.parseInt(importOrderDto.getColumn3())); // 宸烽亾
+                }
+            } else {
+                orderDetl.setBrand(importOrderDto.getColumn1());
+                orderDetl.setSupp(importOrderDto.getColumn3());
+                orderDetl.setMemo(importOrderDto.getColumn4());
+            }
+
+            orderDetl.setBatch("");
+            orderDetl.setOrderId(orderId);
+            orderDetl.setOrderNo(orderNo);
+            orderDetl.setCreateBy(9527L);
+            orderDetl.setCreateTime(new Date());
+            orderDetl.setUpdateBy(9527L);
+            orderDetl.setUpdateTime(new Date());
+            orderDetl.setStatus(1);
+            orderDetl.setQty(0.0D);
+            orderDetl.setAnfme(1.0);
+
+            orderDetlList.add(orderDetl);
+        }
+
+        // 鉁� 鍏抽敭鐐癸細鍒嗘壒鎻愪氦
+        for (int i = 0; i < orderDetlList.size(); i += MAX_BATCH_SIZE) {
+            int end = Math.min(i + MAX_BATCH_SIZE, orderDetlList.size());
+            List<OrderDetl> batch = orderDetlList.subList(i, end);
+            //reviewDetlService.batchDetls(batch);
+        }
+
+        log.info("瀛樺偍鏁版嵁搴撴垚鍔燂紒");
+    }
+
+
+    /**
+     * 瑙f瀽鍑虹幇閿欒浼氳繘鍏ヨ鏂规硶 鍏蜂綋鐪嬫簮浠g爜鎴栨枃妗�
+     */
+    @Override
+    public void onException(Exception exception, AnalysisContext context) throws Exception {
+        log.error("澶勭悊寮傚父锛�" + exception.getMessage());
+        throw exception;
+    }
+}
diff --git a/src/main/java/com/zy/asrs/mapper/ReviewDetlMapper.java b/src/main/java/com/zy/asrs/mapper/ReviewDetlMapper.java
new file mode 100644
index 0000000..ad04a4f
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/ReviewDetlMapper.java
@@ -0,0 +1,19 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.OrderDetl;
+import com.zy.asrs.entity.Review;
+import com.zy.asrs.entity.ReviewDetl;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+@Repository
+public interface ReviewDetlMapper extends BaseMapper<ReviewDetl> {
+
+    int addToLogTable(ReviewDetl order);
+}
diff --git a/src/main/java/com/zy/asrs/mapper/ReviewMapper.java b/src/main/java/com/zy/asrs/mapper/ReviewMapper.java
new file mode 100644
index 0000000..e7ab983
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/ReviewMapper.java
@@ -0,0 +1,18 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.Order;
+import com.zy.asrs.entity.OrderStatisticsDto;
+import com.zy.asrs.entity.Review;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Mapper
+@Repository
+public interface ReviewMapper extends BaseMapper<Review> {
+
+    int addToLogTable(Review order);
+}
diff --git a/src/main/java/com/zy/asrs/service/ReviewDetlService.java b/src/main/java/com/zy/asrs/service/ReviewDetlService.java
new file mode 100644
index 0000000..041ba21
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/ReviewDetlService.java
@@ -0,0 +1,14 @@
+package com.zy.asrs.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.IService;
+import com.zy.asrs.entity.OrderDetl;
+import com.zy.asrs.entity.ReviewDetl;
+
+import java.util.List;
+
+public interface ReviewDetlService extends IService<ReviewDetl> {
+
+    boolean addToLogTable(ReviewDetl orderDetl);
+
+}
diff --git a/src/main/java/com/zy/asrs/service/ReviewService.java b/src/main/java/com/zy/asrs/service/ReviewService.java
new file mode 100644
index 0000000..a0173a2
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/ReviewService.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.zy.asrs.entity.*;
+
+import java.util.List;
+
+public interface ReviewService extends IService<Review> {
+
+
+    boolean addToLogTable(Review order);
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/ReviewDetlServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/ReviewDetlServiceImpl.java
new file mode 100644
index 0000000..52efedd
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/ReviewDetlServiceImpl.java
@@ -0,0 +1,24 @@
+package com.zy.asrs.service.impl;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.core.common.Cools;
+import com.zy.asrs.entity.OrderDetl;
+import com.zy.asrs.entity.ReviewDetl;
+import com.zy.asrs.mapper.OrderDetlMapper;
+import com.zy.asrs.mapper.ReviewDetlMapper;
+import com.zy.asrs.service.OrderDetlService;
+import com.zy.asrs.service.ReviewDetlService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service("reviewDetlService")
+public class ReviewDetlServiceImpl extends ServiceImpl<ReviewDetlMapper, ReviewDetl> implements ReviewDetlService {
+
+    @Override
+    public boolean addToLogTable(ReviewDetl orderDetl) {
+        return this.baseMapper.addToLogTable(orderDetl) > 0;
+    }
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/ReviewServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/ReviewServiceImpl.java
new file mode 100644
index 0000000..07fdc4e
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/ReviewServiceImpl.java
@@ -0,0 +1,19 @@
+package com.zy.asrs.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.zy.asrs.entity.Order;
+import com.zy.asrs.entity.Review;
+import com.zy.asrs.mapper.ReviewMapper;
+import com.zy.asrs.service.ReviewService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service("reviewService")
+public class ReviewServiceImpl extends ServiceImpl<ReviewMapper, Review> implements ReviewService {
+
+    @Override
+    public boolean addToLogTable(Review order) {
+        return this.baseMapper.addToLogTable(order) > 0;
+    }
+}
diff --git a/src/main/java/com/zy/asrs/task/OrderMoveHistoryScheduler.java b/src/main/java/com/zy/asrs/task/OrderMoveHistoryScheduler.java
index 2f1081a..d86c93c 100644
--- a/src/main/java/com/zy/asrs/task/OrderMoveHistoryScheduler.java
+++ b/src/main/java/com/zy/asrs/task/OrderMoveHistoryScheduler.java
@@ -18,4 +18,12 @@
     public void execute(){
         orderMoveHistoryHandler.start();
     }
+
+    /**
+     * 灏嗗凡瀹屾垚order鍜宱rderDetl绉诲姩鍒發og琛�
+     */
+    @Scheduled(cron = "0/30 * * * * ?")
+    public void execute2(){
+        orderMoveHistoryHandler.start2();
+    }
 }
diff --git a/src/main/java/com/zy/asrs/task/handler/OrderMoveHistoryHandler.java b/src/main/java/com/zy/asrs/task/handler/OrderMoveHistoryHandler.java
index 76ec280..b18c58f 100644
--- a/src/main/java/com/zy/asrs/task/handler/OrderMoveHistoryHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/OrderMoveHistoryHandler.java
@@ -4,8 +4,12 @@
 import com.core.common.Cools;
 import com.zy.asrs.entity.Order;
 import com.zy.asrs.entity.OrderDetl;
+import com.zy.asrs.entity.Review;
+import com.zy.asrs.entity.ReviewDetl;
 import com.zy.asrs.service.OrderDetlService;
 import com.zy.asrs.service.OrderService;
+import com.zy.asrs.service.ReviewDetlService;
+import com.zy.asrs.service.ReviewService;
 import com.zy.asrs.task.AbstractHandler;
 import com.zy.asrs.task.core.ReturnT;
 import lombok.extern.slf4j.Slf4j;
@@ -23,19 +27,36 @@
     @Autowired
     private OrderDetlService orderDetlService;
 
-    public ReturnT<String> start(){
+    @Autowired
+    private ReviewService reviewService;
+    @Autowired
+    private ReviewDetlService reviewDetlService;
+
+    public ReturnT<String> start() {
         List<Order> settleEqual6 = orderService.selectList(new EntityWrapper<Order>()
                 .eq("settle", 6));
         for (Order order : settleEqual6) {
             List<OrderDetl> orderDetls = orderDetlService.selectList(new EntityWrapper<OrderDetl>()
                     .eq("order_no", order.getOrderNo()));
-            moveBoth(order,orderDetls);
-            log.info("宸插畬鎴愬崟鎹Щ鍔ㄨ嚦鍘嗗彶琛ㄦ垚鍔� =====>" +order);
+            moveBoth(order, orderDetls);
+            log.info("宸插畬鎴愬崟鎹Щ鍔ㄨ嚦鍘嗗彶琛ㄦ垚鍔� =====>" + order);
         }
         return SUCCESS;
     }
 
-    private void moveBoth(Order order, List<OrderDetl> orderDetls){
+    public ReturnT<String> start2() {
+        List<Review> settleEqual6 = reviewService.selectList(new EntityWrapper<Review>()
+                .eq("settle", 6));
+        for (Review order : settleEqual6) {
+            List<ReviewDetl> orderDetls = reviewDetlService.selectList(new EntityWrapper<ReviewDetl>()
+                    .eq("order_no", order.getOrderNo()));
+            moveBoth2(order, orderDetls);
+            log.info("宸插畬鎴愬鍚堝崟鎹Щ鍔ㄨ嚦鍘嗗彶琛ㄦ垚鍔� =====>" + order);
+        }
+        return SUCCESS;
+    }
+
+    private void moveBoth(Order order, List<OrderDetl> orderDetls) {
         Date now = new Date();
         if (!Cools.isEmpty(orderDetls)) {
             for (OrderDetl orderDetl : orderDetls) {
@@ -43,16 +64,36 @@
                 orderDetl.setUpdateTime(now);
                 orderDetlService.addToLogTable(orderDetl);
                 orderDetlService.delete(new EntityWrapper<OrderDetl>()
-                        .eq("id",orderDetl.getId()));
+                        .eq("id", orderDetl.getId()));
             }
         }
-        if (!Cools.isEmpty(order)){
+        if (!Cools.isEmpty(order)) {
             order.setUpdateBy(0L);
             order.setUpdateTime(now);
             orderService.addToLogTable(order);
             orderService.delete(new EntityWrapper<Order>()
-                    .eq("id",order.getId()));
+                    .eq("id", order.getId()));
         }
     }
 
+
+    private void moveBoth2(Review order, List<ReviewDetl> orderDetls) {
+        Date now = new Date();
+        if (!Cools.isEmpty(orderDetls)) {
+            for (ReviewDetl orderDetl : orderDetls) {
+                orderDetl.setUpdateBy(0L);
+                orderDetl.setUpdateTime(now);
+                reviewDetlService.addToLogTable(orderDetl);
+                reviewDetlService.delete(new EntityWrapper<ReviewDetl>()
+                        .eq("id", orderDetl.getId()));
+            }
+        }
+        if (!Cools.isEmpty(order)) {
+            order.setUpdateBy(0L);
+            order.setUpdateTime(now);
+            reviewService.addToLogTable(order);
+            reviewService.delete(new EntityWrapper<Review>()
+                    .eq("id", order.getId()));
+        }
+    }
 }
diff --git a/src/main/resources/mapper/ReviewDetlMapper.xml b/src/main/resources/mapper/ReviewDetlMapper.xml
new file mode 100644
index 0000000..1b3ea32
--- /dev/null
+++ b/src/main/resources/mapper/ReviewDetlMapper.xml
@@ -0,0 +1,12 @@
+<?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.ReviewDetlMapper">
+
+
+    <insert id="addToLogTable">
+        INSERT INTO man_review_detl_log SELECT * FROM man_review_detl WHERE id = #{id}
+    </insert>
+
+
+
+</mapper>
diff --git a/src/main/resources/mapper/ReviewMapper.xml b/src/main/resources/mapper/ReviewMapper.xml
new file mode 100644
index 0000000..634cc7e
--- /dev/null
+++ b/src/main/resources/mapper/ReviewMapper.xml
@@ -0,0 +1,14 @@
+<?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.ReviewMapper">
+
+
+    <insert id="addToLogTable">
+        INSERT INTO man_review_log
+        SELECT *
+        FROM man_review
+        WHERE id = #{id}
+    </insert>
+
+
+</mapper>
diff --git a/src/main/webapp/static/js/review/review.js b/src/main/webapp/static/js/review/review.js
new file mode 100644
index 0000000..caea5f8
--- /dev/null
+++ b/src/main/webapp/static/js/review/review.js
@@ -0,0 +1,839 @@
+var insTbCount = 0;
+var tableCache2 = [];
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).extend({
+    notice: 'notice/notice',
+}).use(['layer', 'form', 'table','upload','element',  'util', 'admin', 'xmSelect', 'laydate', 'tableMerge', 'notice'], function () {
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var form = layui.form;
+    var table = layui.table;
+    var util = layui.util;
+    var upload = layui.upload;
+    var admin = layui.admin;
+    var xmSelect = layui.xmSelect;
+    var layDate = layui.laydate;
+    var laytpl = layui.laytpl;
+    var tableMerge = layui.tableMerge;
+    var notice = layui.notice;
+    var element = layui.element;
+
+
+
+    // 娓叉煋琛ㄦ牸
+    var insTb = table.render({
+        elem: '#order',
+        url: baseUrl+'/review/head/page/auth',
+        headers: {token: localStorage.getItem('token')},
+        page: true,
+        cellMinWidth: 100,
+        cols: [[
+            {type: 'numbers'},
+            {field: 'orderNo', title: '鍗曟嵁缂栧彿'},
+            {field: 'cstmrName', align: 'center',title: '瀹㈡埛鍚嶇О'},
+            {align: 'center', title: '鏄庣粏', toolbar: '#tbLook', minWidth: 160, width: 160},
+            {field: 'createTime$', title: '鍒涘缓鏃堕棿', minWidth: 200, width: 200},
+            {field: 'settle$', align: 'center', title: '鐘舵��', templet: '#settleTpl',  minWidth: 160, width: 160},
+            //{field: 'memo', align: 'center',title: '澶囨敞'},
+            {align: 'center', title: '鎿嶄綔', toolbar: '#operate', width: 240}
+        ]],
+        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) {
+            limit();
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            insTbCount = count;
+        }
+    });
+
+    // 鎼滅储
+    form.on('submit(tbSearch)', function (data) {
+        insTb.reload({where: data.field, page: {curr: 1}});
+    });
+
+    //澶氭枃浠跺垪琛�
+    var uploadListIns = upload.render({
+        elem: '#data-btn-file2'
+        ,elemList: $('#data-btn-file3') //鍒楄〃鍏冪礌瀵硅薄
+        ,url: baseUrl+'/review/insert/labelUp/file/auth'
+        ,accept: 'file'
+        ,multiple: true
+        ,number: 10
+        ,auto: false
+        ,bindAction: '#testListAction'
+        ,choose: function(obj){
+            // 璧嬪��
+            this.data.orderId=$('.layui-layer-title').text()
+            var that = this;
+            var files = this.files = obj.pushFile(); //灏嗘瘡娆¢�夋嫨鐨勬枃浠惰拷鍔犲埌鏂囦欢闃熷垪
+            //璇诲彇鏈湴鏂囦欢
+            obj.preview(function(index, file, result){
+                var tr = $(['<tr id="upload-'+ index +'">'
+                    ,'<td>'+ file.name +'</td>'
+                    ,'<td>'+ (file.size/1014).toFixed(1) +'kb</td>'
+                    ,'<td><div class="layui-progress" lay-filter="progress-demo-'+ index +'"><div class="layui-progress-bar" lay-percent=""></div></div></td>'
+                    ,'<td>'
+                    ,'<button class="layui-btn layui-btn-xs demo-reload layui-hide">閲嶄紶</button>'
+                    // ,'<button class="layui-btn layui-btn-xs layui-btn-danger demo-delete">鍒犻櫎</button>'
+                    ,'</td>'
+                    ,'</tr>'].join(''));
+
+                //鍗曚釜閲嶄紶
+                tr.find('.demo-reload').on('click', function(){
+                    obj.upload(index, file);
+                });
+
+                //鍒犻櫎
+                tr.find('.demo-delete').on('click', function(){
+                    delete files[index]; //鍒犻櫎瀵瑰簲鐨勬枃浠�
+                    tr.remove();
+                    uploadListIns.config.elem.next()[0].value = ''; //娓呯┖ input file 鍊硷紝浠ュ厤鍒犻櫎鍚庡嚭鐜板悓鍚嶆枃浠朵笉鍙��
+                });
+
+                that.elemList.append(tr);
+                element.render('progress'); //娓叉煋鏂板姞鐨勮繘搴︽潯缁勪欢
+            });
+        }
+        ,done: function(res, index, upload){ //鎴愬姛鐨勫洖璋�
+            var that = this;
+            //if(res.code == 0){ //涓婁紶鎴愬姛
+            var tr = that.elemList.find('tr#upload-'+ index)
+                ,tds = tr.children();
+            tds.eq(3).html(''); //娓呯┖鎿嶄綔
+            delete this.files[index]; //鍒犻櫎鏂囦欢闃熷垪宸茬粡涓婁紶鎴愬姛鐨勬枃浠�
+            return;
+            //}
+            this.error(index, upload);
+        }
+        ,allDone: function(obj){ //澶氭枃浠朵笂浼犲畬姣曞悗鐨勭姸鎬佸洖璋�
+            console.log(obj)
+        }
+        ,error: function(index, upload){ //閿欒鍥炶皟
+            var that = this;
+            var tr = that.elemList.find('tr#upload-'+ index)
+                ,tds = tr.children();
+            tds.eq(3).find('.demo-reload').removeClass('layui-hide'); //鏄剧ず閲嶄紶
+        }
+        ,progress: function(n, elem, e, index){ //娉ㄦ剰锛歩ndex 鍙傛暟涓� layui 2.6.6 鏂板
+            element.progress('progress-demo-'+ index, n + '%'); //鎵ц杩涘害鏉°�俷 鍗充负杩斿洖鐨勮繘搴︾櫨鍒嗘瘮
+        }
+    });
+
+    // 娣诲姞
+    $("#orderAddBtn").click(function () {
+        showEditModel();
+    });
+
+    // 宸ュ叿鏉$偣鍑讳簨浠�
+    table.on('tool(order)', function (obj) {
+        var data = obj.data;
+        var layEvent = obj.event;
+        if (layEvent === 'edit') {
+            showEditModel(data);
+        } else if (layEvent === 'wrkTrace') {
+            showWrkTrace(data.id);
+        } else if (layEvent === 'del') {
+            doDel(data.id);
+        } else if (layEvent === 'labelUp') {
+            //涓婁紶鏍囩
+            // 鎵撳紑寮圭獥
+            // 鏋勫缓甯﹀弬鏁扮殑鍐呭
+            layer.open({
+                area: '1020px',
+                type: 1,
+                title: '涓婁紶鏂囦欢-'+data.id,
+                content: $('#myModal')
+            });
+            // 鑾峰彇璺緞涓嬬殑鏂囦欢鍒楄〃锛屼娇鐢� jQuery 鐨� ajax 鏂规硶
+            $.ajax({
+                url: baseUrl+'/review/view/labelUp/file/auth',
+                data:{
+                    orderId:data.id
+                },
+                success: function(response) {
+                    if (response.code==200){
+                        var targetTable = document.getElementById("data-btn-file3");
+                        targetTable.innerHTML = '';
+                        // 灏嗚幏鍙栧埌鐨勬枃浠跺垪琛ㄦ坊鍔犲埌鏂囦欢闃熷垪涓繘琛屾樉绀�
+                        response.data.forEach(function(file,index) {
+                            // 鍒涘缓tr鍏冪礌
+                            var tr = document.createElement("tr");
+                            tr.id = "upload-"+index;
+                            tr.innerHTML = '<td>' + file.name + '</td>'
+                                + '<td>' + (file.size / 1024).toFixed(1) + 'kb</td>'
+                                + '<td><div class="layui-progress" lay-filter="progress-demo-' + index + '"><div class="layui-progress-bar" lay-percent=""></div></div></td>'
+                                + '<td>'
+                                + '<button class="layui-btn layui-btn-xs demo-reload layui-hide">閲嶄紶</button>'
+                                // + '<button class="layui-btn layui-btn-xs layui-btn-danger demo-delete">鍒犻櫎</button>'
+                                + '</td>';
+
+                            // 灏唗r鍏冪礌娣诲姞鍒扮洰鏍噒able涓�
+                            targetTable.appendChild(tr);
+                        });
+                    }else {
+                        console.log('Failed to get file list error.');
+                    }
+                },
+                error: function() {
+                    console.log('Failed to get file list.');
+                }
+            });
+        } else if (layEvent === 'refundLoc') {
+            //閫�搴�
+            pakoutPreview([data.id]);
+        } else if (layEvent === 'complete') {
+            doModify(data.id, data.orderNo, 4);
+        } else if (layEvent === 'look') {
+            var $a = $(obj.tr).find('a[lay-event="look"]');
+            var offset = $a.offset();
+            var top = offset.top;
+            var left = offset.left;
+            layer.open({
+                type: 1,
+                title: false,
+                area: '1020px',
+                offset: [top + 'px', (left - 530 + $a.outerWidth()) + 'px'],
+                shade: .01,
+                shadeClose: true,
+                fixed: false,
+                content: '<table id="lookSSXMTable" lay-filter="lookSSXMTable"></table>',
+                success: function (layero) {
+                    table.render({
+                        elem: '#lookSSXMTable',
+                        headers: {token: localStorage.getItem('token')},
+                        url: baseUrl+'/reviewDetl/list/auth',
+                        where: {
+                            order_id: data.id
+                        },
+                        page: true,
+                        cellMinWidth: 100,
+                        cols: [[
+                            {type: 'numbers'},
+                            {field: 'matnr', title: '鐗╄川缂栫爜'},
+                            {field: 'maktx', title: '浜у搧鍚嶇О'},
+                            {field: 'specs', title: '瑙勬牸鍨嬪彿'},
+                            {field: 'batch', title: '鎵规鍙�'},
+                            {field: 'color', title: '鍗峰彿'},
+                            {field: 'qty', title: '鍑哄簱鏁伴噺'},
+                            {field: 'deadTime', title: '鍑哄簱鏃ユ湡'},
+                            {field: 'source', title: '澶嶆牳鐘舵��'},
+                            {field: 'memo', title: '澶嶆牳澶囨敞'}
+                        ]],
+                        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 () {
+                            $(layero).find('.layui-table-view').css('margin', '0');
+                        },
+                        size: ''
+                    });
+                }
+            });
+        }
+    });
+
+    // 鏄剧ず琛ㄥ崟寮圭獥
+    function showEditModel(expTpe) {
+        admin.open({
+            type: 1,
+            title: (expTpe ? '淇敼' : '娣诲姞') + '鍗曟嵁',
+            content: $('#editDialog').html(),
+            area: '1300px',
+            success: function (layero, dIndex) {
+                $(layero).children('.layui-layer-content').css('overflow', 'visible');
+                var isExpAdd = !expTpe;
+                // 鍥炴樉鏁版嵁
+                form.val('editForm', expTpe);
+                if (expTpe) {
+                    $('#orderNo').attr("disabled", "disabled");
+                }
+                // 琛ㄥ崟鎻愪氦浜嬩欢
+                form.on('submit(orderEditSubmit)', function (data) {
+                    // 缁勮鏁版嵁
+                    if (xxDataList.length <= 0) {
+                        layer.tips('璇锋坊鍔犲崟鎹槑缁�', '#matAddBtnComment', {tips: [1, '#ff4c4c']});
+                        return false;
+                    }
+                    let nList = admin.util.deepClone(xxDataList);
+                    for (let xi = 0; xi < nList.length; xi++) {
+                        if (nList[xi].anfme <= 0){
+                            layer.msg('鏄庣粏淇敼鏁伴噺涓嶅悎娉�', {icon: 2});
+                            return false;
+                        }
+                        if (nList[xi].anfme < nList[xi].workQty){
+                            layer.msg('鏁伴噺涓嶈兘灏忎簬宸蹭綔涓氭暟閲�', {icon: 2});
+                            return false;
+                        }
+                    }
+                    layer.load(2);
+                    $.ajax({
+                        url: baseUrl+"/review/form/" + (isExpAdd?"add":"modify") + "/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: JSON.stringify({
+                            orderId: Number(data.field.id),
+                            docType: Number(data.field.docType),
+                            orderNo: data.field.orderNo,
+                            orderDetlList: nList
+                        }),
+                        contentType:'application/json;charset=UTF-8',
+                        method: 'POST',
+                        success: function (res) {
+                            layer.closeAll('loading');
+                            if (res.code === 200){
+                                layer.close(dIndex);
+                                $(".layui-laypage-btn")[0].click();
+                                layer.msg(res.msg, {icon: 1});
+                            } else if (res.code === 403){
+                                top.location.href = baseUrl+"/";
+                            }else {
+                                layer.msg(res.msg, {icon: 2});
+                            }
+                        }
+                    })
+                    return false;
+                });
+                // 鏄庣粏琛ㄦ牸
+                var xxDataList = [];
+                var tbOptions = {
+                    elem: '#formSSXMTable',
+                    headers: {token: localStorage.getItem('token')},
+                    data: xxDataList,
+                    page: true,
+                    height: '350px;',
+                    cellMinWidth: 100,
+                    cols: [[
+                        {type: 'numbers', title: '#'},
+                        {field: 'matnr', title: '瑙勬牸', width: 160},
+                        {field: 'maktx', title: '鍟嗗搧鍚嶇О', width: 200},
+                        {field: 'batch', title: '绠卞彿', edit: true},
+                        {field: 'specs', title: '鎺ュご'},
+                        {field: 'anfme', title: '鏁伴噺(淇敼)', style: 'color: blue;font-weight: bold', edit: true, minWidth: 110, width: 110},
+                        {field: 'workQty', title: '浣滀笟鏁伴噺',  minWidth: 100, width: 100},
+                        // {field: 'unit', title: '鍗曚綅', width: 80},
+                        {field: 'memo', title: '澶囨敞' , edit: true},
+                        {align: 'center', title: '鎿嶄綔', toolbar: '#formSSXMTableBar', minWidth: 80, width: 80, fixed: 'right'}
+                    ]],
+                    done: function (res) {
+                        $(layero).find('.layui-table-view').css('margin', '0');
+                    },
+                    size: ''
+                };
+                if (!isExpAdd) {
+                    $.ajax({
+                        url: baseUrl+"/review/detl/all/auth?orderId=" + expTpe.id,
+                        headers: {'token': localStorage.getItem('token')},
+                        method: 'GET',
+                        async: false,
+                        success: function (res) {
+                            if (res.code === 200){
+                                xxDataList = res.data;
+                                tbOptions.data = xxDataList;
+                            } else if (res.code === 403){
+                                top.location.href = baseUrl+"/";
+                            }else {
+                                layer.msg(res.msg, {icon: 2})
+                            }
+                        }
+                    })
+                }
+                var insTbSSXM = table.render(tbOptions);
+                // 宸ュ叿鏉$偣鍑讳簨浠�
+                table.on('tool(formSSXMTable)', function (obj) {
+                    var data = obj.data;
+                    var layEvent = obj.event;
+                    if (layEvent === 'edit') {
+                        showEditModel2(data);
+                    } else if (layEvent === 'del') {
+                        if(data.workQty > 0){
+                            layer.msg("宸插瓨鍦ㄤ綔涓氭暟閲忥紝涓嶈兘鍒犻櫎", {icon: 2});
+                            return;
+                        }
+                        layer.confirm('纭畾瑕佸垹闄ゅ悧锛�', {
+                            shade: .1,
+                            skin: 'layui-layer-admin'
+                        }, function (i) {
+                            layer.close(i);
+                            for (var j = 0; j < xxDataList.length; j++) {
+                                if (xxDataList[j].matnr === data.matnr && xxDataList[j].batch === data.batch) {
+                                    xxDataList.splice(j, 1);
+                                    break;
+                                }
+                            }
+                            insTbSSXM.reload({data: xxDataList, page: {curr: 1}});
+                        });
+                    }
+                });
+                // 鏄庣粏鏁版嵁淇敼
+                table.on('edit(formSSXMTable)', function (obj) {
+                    let index = obj.tr.attr("data-index");
+                    let data = xxDataList[index];
+                    if (obj.field === 'anfme'){
+                        let vle = Number(obj.value);
+                        if (isNaN(vle)) {
+                            layer.msg("璇疯緭鍏ユ暟瀛�", {icon: 2});
+                            return false;
+                        } else {
+                            if (vle <= 0) {
+                                layer.msg("鏁伴噺蹇呴』澶т簬闆�", {icon: 2});
+                                // data[obj.field] = 0;
+                                // insTbSSXM.reload({data: xxDataList});
+                                return false;
+                            }
+                            if(obj.value < data.workQty){
+                                layer.msg("杈撳叆鏁伴噺涓嶈兘灏忎簬浣滀笟涓暟閲�", {icon: 2});
+                                // data[obj.field] = 0;
+                                // insTbSSXM.reload({data: xxDataList});
+                                return false;
+                            }
+                        }
+                    }
+                    data[obj.field] = obj.value;
+                    insTbSSXM.reload({data: xxDataList});
+                });
+
+                $('#matAddBtnComment').click(function () {
+                    showEditModel2();
+                });
+
+                // 鏄剧ず娣诲姞鏄庣粏琛ㄥ崟寮圭獥
+                function showEditModel2(exp) {
+                    admin.open({
+                        type: 1,
+                        offset: '150px',
+                        area: '680px',
+                        title: (exp ? '淇敼' : '娣诲姞') + '鏄庣粏',
+                        content: $('#matEditDialog').html(),
+                        success: function (layero, dIndex) {
+                            // 鍥炴樉鏁版嵁
+                            form.val('matEditForm', exp);
+                            // 琛ㄥ崟鎻愪氦浜嬩欢
+                            form.on('submit(matEditSubmit)', function (data) {
+                                let selectList = matXmSelect.getValue();
+                                for (let i = 0; i<selectList.length; i++) {
+                                    let item = selectList[i];
+                                    // 鏌ヨ鐗╂枡璇︽儏
+                                    $.ajax({
+                                        url: baseUrl+"/mat/covert/"+item.value+"/auth",
+                                        headers: {'token': localStorage.getItem('token')},
+                                        method: 'GET',
+                                        async: false,
+                                        success: function (res) {
+                                            if (res.code === 200){
+                                                xxDataList.push(res.data);
+                                                insTbSSXM.reload({data: xxDataList, page: {curr: 1}});
+                                            } else if (res.code === 403){
+                                                top.location.href = baseUrl+"/";
+                                            }else {
+                                                layer.msg(res.msg, {icon: 2})
+                                            }
+                                        }
+                                    })
+                                }
+                                layer.close(dIndex);
+                                return false;
+                            });
+                            // 娓叉煋鐗╂枡閫夋嫨
+                            var matXmSelect = xmSelect.render({
+                                el: '#mat',
+                                style: {
+                                    width: '340px',
+                                },
+                                autoRow: true,
+                                toolbar: { show: true },
+                                filterable: true,
+                                remoteSearch: true,
+                                remoteMethod: function(val, cb, show){
+                                    $.ajax({
+                                        url: baseUrl+"/mat/all/get/kv",
+                                        headers: {'token': localStorage.getItem('token')},
+                                        data: {
+                                            condition: val
+                                        },
+                                        method: 'POST',
+                                        success: function (res) {
+                                            if (res.code === 200){
+                                                cb(res.data)
+                                            } else {
+                                                cb([]);
+                                                layer.msg(res.msg, {icon: 2});
+                                            }
+                                        }
+                                    });
+                                }
+                            })
+                            // 寮圭獥涓嶅嚭鐜版粴鍔ㄦ潯
+                            $(layero).children('.layui-layer-content').css('overflow', 'visible');
+                            layui.form.render('select');
+                        }
+                    });
+                }
+
+            }
+        });
+    }
+
+    // 鍒犻櫎鍗曟嵁
+    function doDel(orderId) {
+        layer.confirm('纭畾瑕佸垹闄ゅ悧锛�', {
+            shade: .1,
+            skin: 'layui-layer-admin'
+        }, function (i) {
+            layer.close(i);
+            layer.load(2);
+            $.ajax({
+                url: baseUrl+"/review/delete/auth",
+                headers: {'token': localStorage.getItem('token')},
+                data: {
+                    orderId: orderId
+                },
+                method: 'POST',
+                success: function (res) {
+                    layer.closeAll('loading');
+                    if (res.code === 200){
+                        if (insTbCount === 0) {
+                            insTb.reload({page: {curr: 1}});
+                        } else {
+                            $(".layui-laypage-btn")[0].click();
+                        }
+                        layer.msg(res.msg, {icon: 1});
+                    } else if (res.code === 403){
+                        top.location.href = baseUrl+"/";
+                    }else {
+                        layer.msg(res.msg, {icon: 2});
+                    }
+                }
+            })
+        });
+    }
+
+    // 淇敼璁㈠崟鐘舵��
+    function doModify(orderId, orderNo, settle) {
+        layer.confirm('纭畾瑕佹墜鍔ㄥ畬缁撳悧锛�', {
+            shade: .1,
+            skin: 'layui-layer-admin'
+        }, function (i) {
+            layer.close(i);
+            layer.load(2);
+            console.log(orderId);
+            console.log(settle);
+            $.ajax({
+                url: baseUrl+"/review/update/auth",
+                headers: {'token': localStorage.getItem('token')},
+                data: {
+                    id: orderId,
+                    orderNo: orderNo,
+                    settle: settle
+                },
+                method: 'POST',
+                success: function (res) {
+                    layer.closeAll('loading');
+                    if (res.code === 200){
+                        if (insTbCount === 0) {
+                            insTb.reload({page: {curr: 1}});
+                        } else {
+                            $(".layui-laypage-btn")[0].click();
+                        }
+                        layer.msg(res.msg, {icon: 1});
+                    } else if (res.code === 403){
+                        top.location.href = baseUrl+"/";
+                    }else {
+                        layer.msg(res.msg, {icon: 2});
+                    }
+                }
+            })
+        });
+    }
+
+    // 浠诲姟杩芥函
+    function showWrkTrace(orderId) {
+        let loadIndex = layer.msg('璇锋眰涓�...', {icon: 16, shade: 0.01, time: false});
+        $.ajax({
+            url: baseUrl+"/review/wrk/trace/auth",
+            headers: {'token': localStorage.getItem('token')},
+            data: {
+                orderId: orderId
+            },
+            method: 'POST',
+            success: function (res) {
+                layer.close(loadIndex);
+                if (res.code === 200){
+                    laytpl(wrkTraceDialog.innerHTML).render(res.data, function (html) {
+                        admin.open({
+                            type: 1,
+                            title: '浠诲姟杩芥函',
+                            area: ['800px', '450px'],
+                            shadeClose: true,
+                            content: html,
+                            success: function (layero, dIndex) {
+                                $(layero).children('.layui-layer-content').css('overflow', 'visible');
+                                /** 缁熻鍥捐〃 */
+                                var traceCharts = echarts.init(document.getElementById('wrkTraceCharts'));
+                                var traceOptions = {
+                                    title: {
+                                        text: '鎬婚噺/浣滀笟/瀹屾垚', x: 'center', y: '38%',
+                                        textStyle: {fontSize: 18, color: '#262626', fontWeight: 'normal'},
+                                        subtextStyle: {fontSize: 36, color: '#10B4E8'},
+                                        itemGap: 20
+                                    },
+                                    color: ['#10B4E8', '#E0E0E0', '#FF0000'],
+                                    tooltip: {trigger: 'item'},
+                                    series: [{name: '绠卞瓙鏁伴噺', type: 'pie', radius: ['75%', '80%'], label: {normal: {show: false}}}]
+                                };
+                                traceCharts.setOption(traceOptions);
+                                // 璧嬪��
+                                traceCharts.setOption({
+                                    title: {
+                                        subtext: res.data.totalQty+"/"+res.data.wrkQty+"/"+res.data.endQty
+                                    },
+                                    series: [
+                                        {
+                                            data: [
+                                                {name: '宸蹭綔涓�', value: res.data.wrkQty},
+                                                {name: '鏈綔涓�', value: res.data.totalQty-res.data.wrkQty-res.data.lackQty},
+                                                {name: '搴撳瓨涓嶈冻', value: res.data.lackQty},
+                                            ]
+                                        }
+                                    ]
+                                });
+                            }
+                        });
+                    });
+                } else if (res.code === 403){
+                    top.location.href = baseUrl+"/";
+                }else {
+                    layer.msg(res.msg, {icon: 2});
+                }
+            }
+        })
+    }
+
+    layDate.render({
+        elem: '.layui-laydate-range'
+        ,type: 'datetime'
+        ,range: true
+    });
+
+    function pakoutPreview(ids) {
+        let loadIndex = layer.load(2);
+        $.ajax({
+            url: baseUrl + "/out/refund/loc/preview/auth",
+            headers: {'token': localStorage.getItem('token')},
+            contentType: 'application/json;charset=UTF-8',
+            data: JSON.stringify(ids),
+            method: 'POST',
+            success: function (res) {
+                layer.close(loadIndex);
+                var tableCache;
+                if (res.code === 200){
+                    layer.open({
+                        type: 1
+                        ,title: false
+                        ,closeBtn: false
+                        ,offset: '50px'
+                        ,area: ['1500px', '700px']
+                        ,shade: 0.5
+                        ,shadeClose: false
+                        ,btn: ['鐢熸垚閫�搴撳崟', '绋嶅悗澶勭悊']
+                        ,btnAlign: 'c'
+                        ,moveType: 1 //鎷栨嫿妯″紡锛�0鎴栬��1
+                        ,content: $('#pakoutPreviewBox').html()
+                        ,success: function(layero, index){
+                            stoPreTabIdx = table.render({
+                                elem: '#stoPreTab',
+                                data: res.data,
+                                height: 520,
+                                page: false,
+                                limit: Number.MAX_VALUE,
+                                cellMinWidth: 100,
+                                cols: [[
+                                    {type: 'checkbox'},
+                                    // {type: 'checkbox', merge: ['orderNo']},
+                                    {field: 'orderNo', title: '鍗曟嵁缂栧彿', align: 'center'},
+                                    // {field: 'orderNo', title: '鍗曟嵁缂栧彿', merge: true, align: 'center'},
+                                    {field: 'title', title: '鍟嗗搧', align: 'center', width: 350},
+                                    // {field: 'title', title: '鍟嗗搧', merge: true, align: 'center', width: 350},
+                                    {field: 'batch', title: '绠卞彿', align: 'center'},
+                                    {field: 'model', title: '鍗峰彿', align: 'center', hide: false},
+                                    {field: 'specs', title: '鎺ュご', align: 'center'},
+                                    // {field: 'brand', title: '鏈ㄧ绫诲瀷', align: 'center'},
+                                    {field: 'brand$', title: '鏈ㄧ绫诲瀷', align: 'center'},
+                                    {field: 'zpallet', title: '鎵樼洏鐮�', align: 'center'},
+                                    {field: 'anfme', title: '鏁伴噺', align: 'center', width: 90, style: 'font-weight: bold'},
+                                    {field: 'count', title: '鏁伴噺', align: 'center', width: 90, style: 'font-weight: bold'},
+                                    {field: 'locNo', title: '璐т綅', align: 'center', width: 100, templet: '#locNoTpl'},
+                                    {field: 'tkType$', title: 'TK鏍囪', align: 'center', width: 100},
+                                    // {field: 'staNos', align: 'center', title: '鍑哄簱绔�', merge: ['locNo'], templet: '#tbBasicTbStaNos'},
+                                    // {type: 'checkbox', merge: ['locNo']},
+                                ]],
+                                done: function (res) {
+                                    tableMerge.render(this);
+                                    $('.layui-table-body.layui-table-main').css("overflow", "auto");
+                                    tableCache = tableData = table.cache.stoPreTab;
+                                }
+                            });
+                            // 淇敼鍑哄簱绔�
+                            form.on('select(tbBasicTbStaNos)', function (obj) {
+                                let index  = obj.othis.parents('tr').attr("data-index");
+                                let data = tableCache[index];
+                                for (let i = 0; i<tableCache.length; i++) {
+                                    if (tableCache[i].locNo === data.locNo) {
+                                        tableCache[i]['staNo'] = Number(obj.elem.value);
+                                    }
+                                }
+                                obj.othis.children().find("input").css("color", "blue");
+                                return false;
+                            });
+                            // 鎵归噺淇敼鍑哄簱绔�
+                            form.on('submit(batchModifySta)', function () {
+                                let stoPreTabData = layui.table.checkStatus('stoPreTab').data;
+                                if (stoPreTabData.length < 1) {
+                                    layer.msg("璇疯嚦灏戦�夋嫨涓�鏉′互涓婂悎骞舵暟鎹�", {icon: 7});
+                                    return false;
+                                }
+                                modifySta(stoPreTabData);
+                            });
+                            // 鎵归噺淇敼鍑哄簱绔� - 绔欑偣閫夋嫨
+                            function modifySta(stoPreTabData) {
+                                // 鍑哄簱绔欏彇浜ら泦
+                                let staBatchSelectVal = [];
+                                for(let i = 0; i<stoPreTabData.length; i++) {
+                                    let staNos = stoPreTabData[i].staNos;
+                                    if (staNos !== null) {
+                                        if (staBatchSelectVal.length === 0) {
+                                            staBatchSelectVal = staNos;
+                                        } else {
+                                            staBatchSelectVal = staBatchSelectVal.filter(val =>
+                                                {
+                                                    return new Set(staNos).has(val)
+                                                }
+                                            )
+                                        }
+                                    }
+                                }
+                                if (staBatchSelectVal.length === 0) {
+                                    layer.msg("鍑哄簱绔欐病鏈変氦闆嗭紝鏃犳硶鎵归噺淇敼", {icon: 2});
+                                    return;
+                                }
+                                admin.open({
+                                    type: 1,
+                                    area: '300px',
+                                    offset: 'auto',
+                                    title: '璇烽�夋嫨绔欑偣',
+                                    content: $('#staBatchSelectDialog').html(),
+                                    success: function (layero, ddIndex) {
+                                        // 娓叉煋涓嬫媺妗�
+                                        let template = Handlebars.compile($('#batchStaSelectTpl').html());
+                                        $('#batchSelectStaBox').html(template({list: staBatchSelectVal}));
+                                        // 纭
+                                        form.on('submit(staBatchSelectConfirm)', function (obj) {
+                                            let loadIdx = layer.load(2);
+                                            let batchSta = Number(obj.field.batchSta);
+                                            let arr = [];
+                                            for (let j = 0; j<stoPreTabData.length; j++) {
+                                                for (let i = 0; i<tableCache.length; i++) {
+                                                    if (tableCache[i].orderNo === stoPreTabData[j].orderNo
+                                                        && tableCache[i].matnr === stoPreTabData[j].matnr
+                                                        && tableCache[i].locNo === stoPreTabData[j].locNo) {
+                                                        tableCache[i]['staNo'] = batchSta;
+                                                        arr.push(i);
+                                                    }
+                                                }
+                                            }
+                                            stoPreTabIdx.reload({data: tableCache});
+                                            arr.forEach(item => {
+                                                $('div[lay-id=stoPreTab] tr[data-index="' + item + '"] .order-sta-select').val(batchSta);
+                                            });
+                                            layui.form.render('select');
+                                            arr.forEach(item => {
+                                                $('div[lay-id=stoPreTab] tr[data-index="' + item + '"] .layui-select-title').find("input").css("color", "blue");
+                                            });
+                                            layer.close(loadIdx); layer.close(ddIndex);
+                                            return false;
+                                        });
+                                        // 寮圭獥涓嶅嚭鐜版粴鍔ㄦ潯
+                                        $(layero).children('.layui-layer-content').css('overflow', 'visible');
+                                        layui.form.render('select');
+                                    },
+                                })
+                            }
+
+                        }
+                        ,yes: function(index, layero){
+                            //鎸夐挳銆愰��搴撱�戠殑鍥炶皟
+                            pakout(tableCache2, index);
+                            tableCache2 = []
+                        }
+                        ,btn2: function(index, layero){
+                            //鎸夐挳銆愮◢鍚庡鐞嗐�戠殑鍥炶皟
+                            layer.close(index)
+                            tableCache2 = []
+                            //return false 寮�鍚浠g爜鍙姝㈢偣鍑昏鎸夐挳鍏抽棴
+                        }
+                    });
+                } else if (res.code === 403){
+                    top.location.href = baseUrl+"/";
+                } else {
+                    layer.msg(res.msg, {icon: 2})
+                }
+            }
+        })
+
+        // 澶嶉�夋浜嬩欢
+        table.on('checkbox(stoPreTab)', function(obj){
+            tableCache2.push(obj.data)
+        });
+    }
+
+    function pakout(tableCache, layerIndex) {
+        // let loadIndex = layer.load(2);
+        notice.msg('姝e湪鐢熸垚鍑哄簱浠诲姟......', {icon: 4});
+        $.ajax({
+            url: baseUrl + "/out/refund/loc/auth",
+            headers: {'token': localStorage.getItem('token')},
+            contentType: 'application/json;charset=UTF-8',
+            data: JSON.stringify(tableCache),
+            method: 'POST',
+            success: function (res) {
+                notice.destroy();
+                if (res.code === 200) {
+                    layer.close(layerIndex);
+                    layer.msg(res.msg, {icon: 1});
+                    insTb.reload({where: null});
+                    insTb2.reload({where: null, page: {curr: 1}});
+                } else if (res.code === 403) {
+                    top.location.href = baseUrl + "/";
+                } else {
+                    layer.msg(res.msg, {icon: 2})
+                }
+            }
+        });
+    }
+});
diff --git a/src/main/webapp/views/review/review.html b/src/main/webapp/views/review/review.html
new file mode 100644
index 0000000..4ae1fcd
--- /dev/null
+++ b/src/main/webapp/views/review/review.html
@@ -0,0 +1,389 @@
+<!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">
+    <link rel="stylesheet" href="../../static/css/originTable.css" media="all">
+    <!--    <link rel="stylesheet" href="../../static/css/common.css" media="all">-->
+    <!--[if lt IE 9]>
+    <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
+    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
+    <![endif]-->
+    <style>
+        .wrk-trace {
+            color: green;
+            cursor: pointer;
+            margin-left: 6px;
+            font-size: 18px;
+        }
+
+        .layui-timeline:first-child .layui-timeline-item {
+            margin-top: 30px;
+        }
+        .btn-add {
+            display: none;
+        }
+        .btn-edit {
+            display: none;
+        }
+        .btn-complete {
+            display: none;
+        }
+        .btn-delete {
+            display: none;
+        }
+    </style>
+</head>
+<body>
+
+<!-- 姝f枃寮�濮� -->
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body">
+            <!-- 琛ㄦ牸椤堕儴宸ュ叿鏍� -->
+            <div class="layui-form toolbar">
+                <div class="layui-form-item">
+                    <div class="layui-inline">
+                        <div class="layui-input-inline mr0">
+                            <input name="order_no" class="layui-input" type="text" placeholder="杈撳叆鍗曟嵁缂栧彿"/>
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-input-inline mr0">
+                            <input name="cstmr_name" class="layui-input" type="text" placeholder="璇疯緭鍏ュ鎴峰悕绉�"/>
+                        </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">
+                            <select name="doc_type" id="docType-query">
+                            </select>
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <select name="settle">
+                                <option value="">閫夋嫨鐘舵��</option>
+                                <option value="1">寰呭鐞�</option>
+                                <option value="2">浣滀笟涓�</option>
+                                <option value="4">宸插畬鎴�</option>
+                                <option value="6">涓婃姤瀹屾垚</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <button class="layui-btn icon-btn" lay-filter="tbSearch" lay-submit>
+                            <i class="layui-icon">&#xe615;</i>鎼滅储
+                        </button>
+<!--                        <button id="orderAddBtn" class="layui-btn icon-btn btn-add"><i class="layui-icon">&#xe654;</i>娣诲姞-->
+<!--                        </button>-->
+                        <input type="file" id="fileInput" accept=".xlsx, .xls">
+                        <button onclick="exportExc()">瀵煎叆璁㈠崟</button>
+                    </div>
+                </div>
+            </div>
+            <table id="order" lay-filter="order"></table>
+        </div>
+    </div>
+    <div class="layui-card">
+        <div class="layui-card-body">
+<!--            鍏ュ簱閫氱煡鍗曪細鐢盓RP鎻愪緵鍗曟嵁缂栧彿銆佺被鍨嬨�佸崟鎹椂闂村強鐗╂枡鏄庣粏锛岀敓鎴愬叆搴撲綔涓氬崟锛屼负缁存姢绯荤粺楂樺彲鐢紝鐢ㄦ埛鍙嚜琛屾坊鍔犲叆搴撻�氱煡鍗曟暟鎹紝瀹屾垚鐙珛鐨勫叆搴撲綔涓氥��-->
+<!--            <span class="text-danger">鎵嬪姩娣诲姞鏃讹紝璇锋鏌ュ崟鎹紪鍙锋槸鍚﹀湪ERP绯荤粺涓凡瀛樺湪锛岄伩鍏嶅彂鐢熸暟鎹敊璇棶棰樸��</span>-->
+            <span class="text-danger">鍑哄簱鏃讹紝璇锋鏌ュ崟鎹紪鍙锋槸鍚﹀湪绯荤粺涓凡瀛樺湪锛岄伩鍏嶅彂鐢熸暟鎹敊璇棶棰樸��</span>
+        </div>
+    </div>
+</div>
+<script>
+    function exportExc() {
+        var fileInput = document.getElementById('fileInput');
+        var file = fileInput.files[0];
+        if (file === undefined) {
+            alert('璇峰厛閫夋嫨鏂囦欢')
+            return
+        }
+        var formData = new FormData();
+        formData.append('file', file);
+
+        fetch(baseUrl+'/importOrder', {
+            method: 'POST',
+            headers: {'token': localStorage.getItem('token')},
+            body: formData
+        }).then(response => {
+            response.text().then(data => {
+                var res = JSON.parse(data)
+                alert(res.msg)
+            })
+        }).catch(error => {
+            alert('瀵煎叆寮傚父');
+        });
+    }
+</script>
+<div id="myModal"  style="display: none">
+    <div style="padding: 10px">
+        <div class="layui-upload">
+            <button type="button" class="layui-btn layui-btn-normal" id="data-btn-file2">閫夋嫨鏂囦欢</button><input id="data-btn-upload" class="layui-upload-file" type="file" accept="" name="file" multiple="">
+            <div class="layui-upload-list" style="max-width: 1000px;height:400px;overflow: scroll">
+                <table class="layui-table">
+                    <colgroup>
+                        <col>
+                        <col width="150">
+                        <col width="260">
+                        <col width="150">
+                    </colgroup>
+                    <thead>
+                    <tr><th>鏂囦欢鍚�</th>
+                        <th>澶у皬</th>
+                        <th>涓婁紶杩涘害</th>
+                        <th>鎿嶄綔</th>
+                    </tr></thead>
+                    <tbody id="data-btn-file3"></tbody>
+                </table>
+            </div>
+            <button type="button" class="layui-btn" id="testListAction">寮�濮嬩笂浼�</button>
+        </div>
+    </div>
+</div>
+<!-- 琛ㄦ牸鎿嶄綔鍒� -->
+<script type="text/html" id="operate">
+    {{# if (d.settle == 0 || d.settle == 1) { }}
+<!--        <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>
+    <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-edit" lay-event="complete">瀹岀粨</a>
+<!--        <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="labelUp">涓婁紶鏍囩</a>-->
+    {{# } }}
+    {{# if (d.settle == 2) { }}
+<!--    <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="labelUp">涓婁紶鏍囩</a>-->
+    <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-edit" lay-event="complete">瀹岀粨</a>
+    {{# } }}
+    {{# if (d.settle == 4 && d.tkType=='1') { }}
+<!--        <a class="layui-btn layui-btn-danger layui-btn-xs btn-delete" lay-event="refundLoc">閫�搴�</a>-->
+    {{# } }}
+</script>
+<!-- 琛ㄦ牸鎿嶄綔鍒� -->
+<script type="text/html" id="tbLook">
+    <span class="layui-text">
+        <a href="javascript:;" lay-event="look">
+            <i class="layui-icon" style="font-size: 12px;">&#xe61a;</i> 鏌ョ湅鍗曟嵁鏄庣粏
+        </a>
+    </span>
+</script>
+<script type="text/html" id="orderNoTpl">
+    {{d.orderNo}}
+    {{# if(d.settle > 1 && d.settle !== 3){ }}
+
+    {{# } }}
+    <i class="layui-icon layui-icon-about wrk-trace" lay-tips="鏌ョ湅浠诲姟杩芥函" lay-direction="2" lay-offset="-10px,0px" lay-event="wrkTrace"></i>
+</script>
+
+<!--<script type="text/html" id="settleTpl">-->
+<!--    <span name="settle" class="layui-badge layui-badge-gray">{{d.settle$}}</span>-->
+<!--</script>-->
+<script type="text/html" id="settleTpl">
+    <span name="settle"
+          {{# if( d.settle === 1){ }}
+          class="layui-badge layui-badge-red"
+          {{# }else if(d.settle === 2){ }}
+          class="layui-badge layui-badge-green"
+          {{# }else if(d.settle === 3){ }}
+          class="layui-badge layui-badge-gray"
+          {{# }else if(d.settle === 4){ }}
+          class="layui-badge layui-badge-blue"
+          {{# }else if(d.settle === 5){ }}
+          class="layui-badge layui-badge-gray"
+          {{# }else if(d.settle === 6){ }}
+          class="layui-badge layui-badge-gray"
+          {{# } }}
+    >{{d.settle$}}</span>
+</script>
+<!-- 琛ㄥ崟寮圭獥 -->
+<script type="text/html" id="editDialog">
+    <form id="editForm" lay-filter="editForm" class="layui-form model-form">
+        <input name="id" type="hidden"/>
+        <div class="layui-form-item">
+            <label class="layui-form-label">鍗曟嵁绫诲瀷锛�</label>
+            <div class="layui-input-block cool-auto-complete">
+                <input class="layui-input" name="docType" placeholder="璇疯緭鍏ュ崟鎹被鍨�" style="display: none">
+                <input id="docType$" name="docType$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="璇疯緭鍏ュ崟鎹被鍨�" onfocus=this.blur() lay-verType="tips" lay-verify="required">
+                <div class="cool-auto-complete-window">
+                    <input class="cool-auto-complete-window-input" data-key="docTypeQueryBydocType" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                    <select class="cool-auto-complete-window-select" data-key="docTypeQueryBydocTypeSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                    </select>
+                </div>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">鍗曟嵁缂栧彿锛�</label>
+            <div class="layui-input-block">
+                <input id="orderNo" name="orderNo" placeholder="杈撳叆鍗曟嵁缂栧彿" type="text" class="layui-input" maxlength="20" lay-verType="tips" />
+<!--                lay-verify="required"-->
+            </div>
+        </div>
+        <div class="layui-form-item" style="position: relative;">
+            <label class="layui-form-label">鍗曟嵁鏄庣粏锛�</label>
+            <div class="layui-input-block">
+                <table id="formSSXMTable" lay-filter="formSSXMTable"></table>
+            </div>
+            <button class="layui-btn layui-btn-sm icon-btn" id="matAddBtnComment"
+                    style="position: absolute; left: 20px;top: 60px;padding: 0 5px;" type="button">
+                <i class="layui-icon">&#xe654;</i>娣诲姞鏄庣粏
+            </button>
+        </div>
+        <div class="layui-form-item text-right">
+            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">鍙栨秷</button>
+            <button class="layui-btn" lay-filter="orderEditSubmit" lay-submit>淇濆瓨</button>
+        </div>
+    </form>
+</script>
+<!-- 琛ㄦ牸鎿嶄綔鍒� -->
+<script type="text/html" id="formSSXMTableBar">
+    <!--    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">淇敼</a>-->
+    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">鍒犻櫎</a>
+</script>
+<!-- 琛ㄥ崟寮圭獥 -->
+<script type="text/html" id="matEditDialog">
+    <form id="matEditForm" lay-filter="matEditForm" class="layui-form model-form">
+        <input name="experimentId" type="hidden"/>
+        <div class="layui-form-item" style="float: left">
+            <label class="layui-form-label">鐗╂枡 - 澶氶��</label>
+            <div class="layui-input-block">
+                <div id="mat" name="mat">
+                </div>
+            </div>
+        </div>
+        <div class="layui-form-item text-right" style="display: inline-block; margin-left: 35px">
+            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">鍙栨秷</button>
+            <button class="layui-btn" lay-filter="matEditSubmit" lay-submit>淇濆瓨</button>
+        </div>
+    </form>
+</script>
+<!-- 璁㈠崟浠诲姟杩芥函 -->
+<script id="wrkTraceDialog" type="text/html" style="position: relative">
+    <div style="position: absolute; top: 0; left: 0;">
+        <div class="layui-card" style="overflow: hidden;">
+            <div class="layui-card-header" style="text-align: center;width: 80%;font-weight: inherit;font-size: 18px">{{ d.orderNo }}</div>
+            <div class="layui-card-body">
+                <div id="wrkTraceCharts" style="height: 300px;width: 400px;transform: translateX(-10%);"></div>
+            </div>
+        </div>
+    </div>
+    <div class="layui-row" >
+        <div class="layui-col-md5">
+            <h1 style="opacity: 0;">Hello World</h1>
+        </div>
+        <div  class="layui-col-md7" style="">
+            {{#  if(d.list.length > 0){ }}
+            <ul class="layui-timeline" style="height: 400px; overflow: scroll;">
+                {{#  layui.each(d.list, function(index, item){ }}
+                <li class="layui-timeline-item">
+                    <i class="layui-icon layui-timeline-axis">&#xe63f;</i>
+                    <div class="layui-timeline-content layui-text">
+                        <div class="layui-timeline-title">
+                            <h3 class="inline-block">
+                                {{ item.wrkNo }}&nbsp;
+
+                                {{#  if(item.wrkMast.ioType < 100){ }}
+                                <span class="layui-badge layui-bg-blue" style="line-height: 20px;">
+                                 {{ item.wrkMast.ioType$ }}&nbsp;
+                                </span>
+                                {{#  } }}
+
+                                {{#  if(item.wrkMast.ioType > 100){ }}
+                                <span class="layui-badge layui-bg-orange" style="line-height: 20px;">
+                                  {{ item.wrkMast.ioType$ }}&nbsp;
+                                </span>
+                                {{#  } }}
+
+
+                                {{#  if(item.wrkMast.wrkSts < 14){ }}
+                                <span class="layui-badge layui-bg-red" style="line-height: 20px;">
+                                    {{ item.wrkMast.wrkSts$ }}&nbsp;
+                                </span>
+                                {{#  } }}
+
+                                {{#  if(item.wrkMast.wrkSts >= 14){ }}
+                                <span class="layui-badge layui-bg-green" style="line-height: 20px;">
+                                    {{ item.wrkMast.wrkSts$ }}&nbsp;
+                                </span>
+                                {{#  } }}
+
+                            </h3>&emsp;
+                            {{ item.wrkMast.ioTime$ }}
+                        </div>
+
+                        <table class="layui-table" lay-skin="nob" style="width: 80%">
+                            <thead>
+                            <tr style="background: none">
+                                <td>No.</td>
+                                <td>瑙勬牸</td>
+                                <!--                                <td>瑙勬牸</td>-->
+                                <td>绠卞彿</td>
+<!--                                <td>绠卞瓙绫诲瀷</td>-->
+                                <td>鏄惁纭</td>
+                            </tr>
+                            </thead>
+                            <tbody>
+                            {{#  layui.each(item.wrkDetls, function(idx, wrkDetl){ }}
+                            <tr>
+                                <td><span class="layui-badge layui-bg-cyan">{{ idx+1 }}</span></td>
+                                <td>{{ wrkDetl.matnr }}</td>
+                                <!--                                <td>{{ wrkDetl.specs }}</td>-->
+                                <td style="font-weight: bold">{{ wrkDetl.batch }}</td>
+                                <td style="font-weight: bold">{{ wrkDetl.source$ }}</td>
+                            </tr>
+                            {{#  }); }}
+                            </tbody>
+                        </table>
+
+                        <hr class="layui-border-cyan" style="width: 90%; opacity: .6;">
+                    </div>
+                </li>
+                {{#  }); }}
+            </ul>
+            {{#  } else { }}
+            <div style="height: 350px;display: flex;justify-content: center;align-items: center;">
+                <h2 style="font-weight: bold;letter-spacing: 2px">鏆傛棤浠诲姟</h2>
+            </div>
+            {{#  } }}
+        </div>
+    </div>
+
+
+</script>
+
+
+<script type="text/html" id="staBatchSelectDialog">
+    <form class="layui-form" style="padding: 25px 50px 30px 50px;text-align: center">
+        <select id="batchSelectStaBox" name="batchSta" lay-vertype="tips" lay-verify="required" required="">
+        </select>
+        <button style="margin-top: 30px" class="layui-btn" lay-filter="staBatchSelectConfirm" lay-submit="">纭畾</button>
+    </form>
+</script>
+
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/echarts/echarts.min.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/orderTable.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/review/review.js" charset="utf-8"></script>
+
+
+</body>
+
+
+
+
+</html>
+

--
Gitblit v1.9.1