Pārlūkot izejas kodu

fix:二次修改扫码,扣料逻辑

hmc 7 mēneši atpakaļ
vecāks
revīzija
64516e62fe
79 mainītis faili ar 9850 papildinājumiem un 276 dzēšanām
  1. 0 1
      pom.xml
  2. 2 2
      zkqy-admin/src/main/resources/kdwebapi.properties
  3. 106 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/controller/HandheldTerminalController.java
  4. 105 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/controller/MaterialRetentionLogController.java
  5. 106 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/controller/ProcedureListController.java
  6. 63 8
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/controller/RingScanInformationController.java
  7. 106 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/controller/RingScanInformationFirstController.java
  8. 120 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/controller/RingTerminalController.java
  9. 8 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/controller/StationInformationController.java
  10. 6 6
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/controller/TeamInformationController.java
  11. 7 4
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/controller/TerminalInformationController.java
  12. 125 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/domain/HandheldTerminal.java
  13. 469 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/domain/MaterialRetentionLog.java
  14. 125 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/domain/ProcedureList.java
  15. 61 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/domain/RingScanInformation.java
  16. 144 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/domain/RingScanInformationFirst.java
  17. 125 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/domain/RingTerminal.java
  18. 46 1
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/domain/TerminalInformation.java
  19. 117 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/domain/vo/RingScanInformationLogVo.java
  20. 26 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/domain/vo/RingScanInformationQueryVo.java
  21. 0 2
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/jd/controller/JdProductionBomsController.java
  22. 401 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/jd/domain/MaterialRetentionLogVo.java
  23. 63 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/mapper/HandheldTerminalMapper.java
  24. 71 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/mapper/MaterialRetentionLogMapper.java
  25. 63 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/mapper/ProcedureListMapper.java
  26. 63 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/mapper/RingScanInformationFirstMapper.java
  27. 9 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/mapper/RingScanInformationMapper.java
  28. 63 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/mapper/RingTerminalMapper.java
  29. 61 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/IHandheldTerminalService.java
  30. 61 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/IMaterialRetentionLogService.java
  31. 61 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/IProcedureListService.java
  32. 61 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/IRingScanInformationFirstService.java
  33. 11 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/IRingScanInformationService.java
  34. 68 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/IRingTerminalService.java
  35. 7 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/IStationInformationService.java
  36. 97 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/impl/HandheldTerminalServiceImpl.java
  37. 98 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/impl/MaterialRetentionLogServiceImpl.java
  38. 97 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/impl/ProcedureListServiceImpl.java
  39. 93 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/impl/RingScanInformationFirstServiceImpl.java
  40. 19 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/impl/RingScanInformationServiceImpl.java
  41. 110 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/impl/RingTerminalServiceImpl.java
  42. 184 32
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/impl/StationInformationServiceImpl.java
  43. 23 1
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/utils/MaUtils.java
  44. 96 0
      zkqy-fujian-amichi/src/main/resources/mapper/HandheldTerminalMapper.xml
  45. 296 0
      zkqy-fujian-amichi/src/main/resources/mapper/MaterialRetentionLogMapper.xml
  46. 1 1
      zkqy-fujian-amichi/src/main/resources/mapper/PlanTaskDetailsMapper.xml
  47. 96 0
      zkqy-fujian-amichi/src/main/resources/mapper/ProcedureListMapper.xml
  48. 92 0
      zkqy-fujian-amichi/src/main/resources/mapper/RingScanInformationFirstMapper.xml
  49. 55 1
      zkqy-fujian-amichi/src/main/resources/mapper/RingScanInformationMapper.xml
  50. 96 0
      zkqy-fujian-amichi/src/main/resources/mapper/RingTerminalMapper.xml
  51. 21 2
      zkqy-fujian-amichi/src/main/resources/mapper/TerminalInformationMapper.xml
  52. 50 0
      zkqy-ui/src/api/amichi/RingTerminal/terminal.js
  53. 44 0
      zkqy-ui/src/api/amichi/handheldTerminal/terminal.js
  54. 44 0
      zkqy-ui/src/api/amichi/materialRetentionLog/log.js
  55. 44 0
      zkqy-ui/src/api/amichi/procedureList/list.js
  56. 8 0
      zkqy-ui/src/api/amichi/ringScanInformation/index.js
  57. 8 1
      zkqy-ui/src/api/system/user.js
  58. 4 5
      zkqy-ui/src/layout/components/Sidebar/index.vue
  59. 1 0
      zkqy-ui/src/router/index.js
  60. 402 0
      zkqy-ui/src/views/amichi/MaterialRetentionLog/index.vue
  61. 43 0
      zkqy-ui/src/views/amichi/RingTerminal/terminal/RingAdd.vue
  62. 307 0
      zkqy-ui/src/views/amichi/RingTerminal/terminal/index.vue
  63. 105 0
      zkqy-ui/src/views/amichi/dialogCompments/customizedVersion/components/TaskItem.vue
  64. 161 0
      zkqy-ui/src/views/amichi/dialogCompments/customizedVersion/components/taskList.vue
  65. 157 0
      zkqy-ui/src/views/amichi/dialogCompments/customizedVersion/processDisplay.vue
  66. 302 0
      zkqy-ui/src/views/amichi/dialogCompments/processDisplay.vue
  67. 288 0
      zkqy-ui/src/views/amichi/handheldTerminal/terminal/index.vue
  68. 41 2
      zkqy-ui/src/views/amichi/planTask/salesPlan.vue
  69. 175 132
      zkqy-ui/src/views/amichi/print/FlowCardPrint.vue
  70. 1 1
      zkqy-ui/src/views/amichi/print/FlowWeldCardPrint.vue
  71. 288 0
      zkqy-ui/src/views/amichi/procedureList/list/index.vue
  72. 6 19
      zkqy-ui/src/views/amichi/ringScanInformation/index.vue
  73. 41 23
      zkqy-ui/src/views/amichi/stationInformation/indexCopyV3.vue
  74. 429 0
      zkqy-ui/src/views/amichi/system/dept/index.vue
  75. 576 0
      zkqy-ui/src/views/amichi/system/menu/index.vue
  76. 754 0
      zkqy-ui/src/views/amichi/system/role/index.vue
  77. 1003 0
      zkqy-ui/src/views/amichi/system/user/index.vue
  78. 162 30
      zkqy-ui/src/views/amichi/terminalInformation/index.vue
  79. 2 2
      zkqy-ui/src/views/login.vue

+ 0 - 1
pom.xml

@@ -215,7 +215,6 @@
             <scope>compile</scope>
         </dependency>
         <!-- 达梦驱动包 -->
-
         <dependency>
             <groupId>com.google.code.gson</groupId>
             <artifactId>gson</artifactId>

+ 2 - 2
zkqy-admin/src/main/resources/kdwebapi.properties

@@ -1,7 +1,7 @@
 # \u7B2C\u4E09\u65B9\u7CFB\u7EDF\u767B\u5F55\u6388\u6743\u7684\u8D26\u5957ID
 X-KDApi-AcctID = 61c7dd2d0ff564
 # \u7B2C\u4E09\u65B9\u7CFB\u7EDF\u767B\u5F55\u6388\u6743\u7684\u7528\u6237
-X-KDApi-UserName =\u738B\u91D1\u660E
+X-KDApi-UserName= \u738B\u91D1\u660E
 # \u7B2C\u4E09\u65B9\u7CFB\u7EDF\u767B\u5F55\u6388\u6743\u7684\u5E94\u7528ID
 X-KDApi-AppID = 291472_5Z6q2/Ho6roeQaXv0d5PS61FQrTa0PNs
 # \u7B2C\u4E09\u65B9\u7CFB\u7EDF\u767B\u5F55\u6388\u6743\u7684\u5E94\u7528\u5BC6\u94A5
@@ -9,7 +9,7 @@ X-KDApi-AppSec = 18d80a2709c7446ea44aa14b7d94e86e
 # \u670D\u52A1Url\u5730\u5740(\u516C\u6709\u4E91\u7EDF\u4E00\u8D70\u7F51\u5173sdk\u5E95\u5C42\u5DF2\u5904\u7406\uFF0C\u65E0\u9700\u4F20X-KDApi-ServerUrl,\u4E0B\u9762\u8FD9\u884C\u9700\u8981\u6CE8\u91CA)
 X-KDApi-ServerUrl =http://192.168.2.134/K3Cloud/
 # \u8D26\u5957\u8BED\u7CFB\uFF0C\u9ED8\u8BA42052
- X-KDApi-LCID = 2052
+X-KDApi-LCID = 2052
 # \u7EC4\u7EC7\u7F16\u7801\uFF0C\u542F\u7528\u591A\u7EC4\u7EC7\u65F6\u914D\u7F6E\u5BF9\u5E94\u7684\u7EC4\u7EC7\u7F16\u7801\u624D\u6709\u6548
 # X-KDApi-OrgNum = 100
 # \u5141\u8BB8\u7684\u6700\u5927\u8FDE\u63A5\u5EF6\u65F6\uFF0C\u5355\u4F4D\u4E3A\u79D2

+ 106 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/controller/HandheldTerminalController.java

@@ -0,0 +1,106 @@
+package com.zkqy.amichi.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.zkqy.common.annotation.Log;
+import com.zkqy.common.core.controller.BaseController;
+import com.zkqy.common.core.domain.AjaxResult;
+import com.zkqy.common.core.page.TableDataInfo;
+import com.zkqy.common.enums.BusinessType;
+import com.zkqy.common.utils.poi.ExcelUtil;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.zkqy.amichi.domain.HandheldTerminal;
+import com.zkqy.amichi.service.IHandheldTerminalService;
+
+
+/**
+ * 扫码扣料日志Controller
+ * 
+ * @author zkqy
+ * @date 2024-11-14
+ */
+@RestController
+@RequestMapping("/handheldTerminal/terminal")
+public class HandheldTerminalController extends BaseController
+{
+    @Autowired
+    private IHandheldTerminalService handheldTerminalService;
+
+    /**
+     * 查询扫码扣料日志列表
+     */
+    @PreAuthorize("@ss.hasPermi('handheldTerminal:terminal:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(HandheldTerminal handheldTerminal)
+    {
+        startPage();
+        List<HandheldTerminal> list = handheldTerminalService.selectHandheldTerminalList(handheldTerminal);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出扫码扣料日志列表
+     */
+    @PreAuthorize("@ss.hasPermi('handheldTerminal:terminal:export')")
+    @Log(title = "扫码扣料日志", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, HandheldTerminal handheldTerminal)
+    {
+        List<HandheldTerminal> list = handheldTerminalService.selectHandheldTerminalList(handheldTerminal);
+        ExcelUtil<HandheldTerminal> util = new ExcelUtil<HandheldTerminal>(HandheldTerminal.class);
+        util.exportExcel(response, list, "扫码扣料日志数据");
+    }
+
+    /**
+     * 获取扫码扣料日志详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('handheldTerminal:terminal:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(handheldTerminalService.selectHandheldTerminalById(id));
+    }
+
+    /**
+     * 新增扫码扣料日志
+     */
+    @PreAuthorize("@ss.hasPermi('handheldTerminal:terminal:add')")
+    @Log(title = "扫码扣料日志", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody HandheldTerminal handheldTerminal)
+    {
+        return toAjax(handheldTerminalService.insertHandheldTerminal(handheldTerminal));
+    }
+
+    /**
+     * 修改扫码扣料日志
+     */
+    @PreAuthorize("@ss.hasPermi('handheldTerminal:terminal:edit')")
+    @Log(title = "扫码扣料日志", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody HandheldTerminal handheldTerminal)
+    {
+        return toAjax(handheldTerminalService.updateHandheldTerminal(handheldTerminal));
+    }
+
+    /**
+     * 删除扫码扣料日志
+     */
+    @PreAuthorize("@ss.hasPermi('handheldTerminal:terminal:remove')")
+    @Log(title = "扫码扣料日志", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(handheldTerminalService.deleteHandheldTerminalByIds(ids));
+    }
+}

+ 105 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/controller/MaterialRetentionLogController.java

@@ -0,0 +1,105 @@
+package com.zkqy.amichi.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.zkqy.common.annotation.Log;
+import com.zkqy.common.core.controller.BaseController;
+import com.zkqy.common.core.domain.AjaxResult;
+import com.zkqy.common.core.page.TableDataInfo;
+import com.zkqy.common.enums.BusinessType;
+import com.zkqy.common.utils.poi.ExcelUtil;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.zkqy.amichi.domain.MaterialRetentionLog;
+import com.zkqy.amichi.service.IMaterialRetentionLogService;
+
+/**
+ * 扫码扣料日志Controller
+ * 
+ * @author ruoyi
+ * @date 2024-11-13
+ */
+@RestController
+@RequestMapping("/materialRetentionLog/log")
+public class MaterialRetentionLogController extends BaseController
+{
+    @Autowired
+    private IMaterialRetentionLogService materialRetentionLogService;
+
+    /**
+     * 查询扫码扣料日志列表
+     */
+    @PreAuthorize("@ss.hasPermi('materialRetentionLog:log:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(MaterialRetentionLog materialRetentionLog)
+    {
+        startPage();
+        List<MaterialRetentionLog> list = materialRetentionLogService.selectMaterialRetentionLogList(materialRetentionLog);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出扫码扣料日志列表
+     */
+    @PreAuthorize("@ss.hasPermi('materialRetentionLog:log:export')")
+    @Log(title = "扫码扣料日志", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, MaterialRetentionLog materialRetentionLog)
+    {
+        List<MaterialRetentionLog> list = materialRetentionLogService.selectMaterialRetentionLogList(materialRetentionLog);
+        ExcelUtil<MaterialRetentionLog> util = new ExcelUtil<MaterialRetentionLog>(MaterialRetentionLog.class);
+        util.exportExcel(response, list, "扫码扣料日志数据");
+    }
+
+    /**
+     * 获取扫码扣料日志详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('materialRetentionLog:log:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(materialRetentionLogService.selectMaterialRetentionLogById(id));
+    }
+
+    /**
+     * 新增扫码扣料日志
+     */
+    @PreAuthorize("@ss.hasPermi('materialRetentionLog:log:add')")
+    @Log(title = "扫码扣料日志", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody MaterialRetentionLog materialRetentionLog)
+    {
+        return toAjax(materialRetentionLogService.insertMaterialRetentionLog(materialRetentionLog));
+    }
+
+    /**
+     * 修改扫码扣料日志
+     */
+    @PreAuthorize("@ss.hasPermi('materialRetentionLog:log:edit')")
+    @Log(title = "扫码扣料日志", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody MaterialRetentionLog materialRetentionLog)
+    {
+        return toAjax(materialRetentionLogService.updateMaterialRetentionLog(materialRetentionLog));
+    }
+
+    /**
+     * 删除扫码扣料日志
+     */
+    @PreAuthorize("@ss.hasPermi('materialRetentionLog:log:remove')")
+    @Log(title = "扫码扣料日志", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(materialRetentionLogService.deleteMaterialRetentionLogByIds(ids));
+    }
+}

+ 106 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/controller/ProcedureListController.java

@@ -0,0 +1,106 @@
+package com.zkqy.amichi.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.zkqy.common.annotation.Log;
+import com.zkqy.common.core.controller.BaseController;
+import com.zkqy.common.core.domain.AjaxResult;
+import com.zkqy.common.core.page.TableDataInfo;
+import com.zkqy.common.enums.BusinessType;
+import com.zkqy.common.utils.poi.ExcelUtil;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.zkqy.amichi.domain.ProcedureList;
+import com.zkqy.amichi.service.IProcedureListService;
+
+/**
+ * 工序列表Controller
+ * 
+ * @author ruoyi
+ * @date 2024-11-14
+ */
+@RestController
+@RequestMapping("/procedureList/list")
+public class ProcedureListController extends BaseController
+{
+    @Autowired
+    private IProcedureListService procedureListService;
+
+    /**
+     * 查询工序列表列表
+     */
+    @PreAuthorize("@ss.hasPermi('procedureList:list:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(ProcedureList procedureList)
+    {
+        startPage();
+        List<ProcedureList> list = procedureListService.selectProcedureListList(procedureList);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出工序列表列表
+     */
+    @PreAuthorize("@ss.hasPermi('procedureList:list:export')")
+    @Log(title = "工序列表", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ProcedureList procedureList)
+    {
+        List<ProcedureList> list = procedureListService.selectProcedureListList(procedureList);
+        ExcelUtil<ProcedureList> util = new ExcelUtil<ProcedureList>(ProcedureList.class);
+        util.exportExcel(response, list, "工序列表数据");
+    }
+
+    /**
+     * 获取工序列表详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('procedureList:list:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(procedureListService.selectProcedureListById(id));
+    }
+
+    /**
+     * 新增工序列表
+     */
+    @PreAuthorize("@ss.hasPermi('procedureList:list:add')")
+    @Log(title = "工序列表", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ProcedureList procedureList)
+    {
+        return toAjax(procedureListService.insertProcedureList(procedureList));
+    }
+
+    /**
+     * 修改工序列表
+     */
+    @PreAuthorize("@ss.hasPermi('procedureList:list:edit')")
+    @Log(title = "工序列表", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody ProcedureList procedureList)
+    {
+        return toAjax(procedureListService.updateProcedureList(procedureList));
+    }
+
+    /**
+     * 删除工序列表
+     */
+    @PreAuthorize("@ss.hasPermi('procedureList:list:remove')")
+    @Log(title = "工序列表", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(procedureListService.deleteProcedureListByIds(ids));
+    }
+}

+ 63 - 8
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/controller/RingScanInformationController.java

@@ -1,27 +1,32 @@
 package com.zkqy.amichi.controller;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletResponse;
 
+import com.github.pagehelper.PageInfo;
+import com.zkqy.amichi.domain.RingScanInformationFirst;
+import com.zkqy.amichi.domain.vo.RingScanInformationLogVo;
+import com.zkqy.amichi.domain.vo.RingScanInformationQueryVo;
 import com.zkqy.amichi.domain.vo.RingScanInformationVo;
+import com.zkqy.amichi.mapper.RingScanInformationFirstMapper;
 import com.zkqy.amichi.service.IRingScanInformationService;
+import com.zkqy.amichi.utils.MaUtils;
 import com.zkqy.common.annotation.Anonymous;
 import com.zkqy.common.annotation.Log;
+import com.zkqy.common.constant.HttpStatus;
 import com.zkqy.common.core.controller.BaseController;
 import com.zkqy.common.core.domain.AjaxResult;
 import com.zkqy.common.core.page.TableDataInfo;
 import com.zkqy.common.enums.BusinessType;
+import com.zkqy.common.utils.PageUtils;
+import com.zkqy.common.utils.StringUtils;
 import com.zkqy.common.utils.poi.ExcelUtil;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import com.zkqy.amichi.domain.RingScanInformation;
 
 
@@ -38,6 +43,9 @@ public class RingScanInformationController extends BaseController
     @Autowired
     private IRingScanInformationService ringScanInformationService;
 
+    @Autowired
+    private RingScanInformationFirstMapper ringScanInformationFirstMapper;
+
     /**
      * 查询指环王扫描日志信息列表
      */
@@ -51,6 +59,53 @@ public class RingScanInformationController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 员工码
+     */
+//    @PreAuthorize("@ss.hasPermi('ringScanInformation:information:list')")
+    @Anonymous
+    @GetMapping("/generate/generateEmployeeCode")
+    public AjaxResult generateEmployeeCode(@RequestParam("userNumber") String userNumber,@RequestParam("userName") String userName)
+    {
+        StringBuilder builder=new StringBuilder();
+        builder.append(userNumber).append("#").append(userName);
+        String s = MaUtils.generateQRCodeConfig(builder.toString(), 400, 400);
+        StringBuilder prefixString=new StringBuilder("data:image/png;base64,");
+        prefixString.append(s);
+        return AjaxResult.success("员工码创建成功",prefixString);
+    }
+
+
+    /**
+     * 管道日志倒推
+     * @param ringScanInformationQueryVo
+     * @return
+     */
+    @Anonymous
+    @GetMapping("/info/scanCodeMonitoringLogs")
+    public AjaxResult  scanCodeMonitoringLogs(RingScanInformationQueryVo ringScanInformationQueryVo)
+    {
+        startPage();
+        RingScanInformationFirst ringScanInformationFirst=new RingScanInformationFirst();
+        ringScanInformationFirst.setStatus(ringScanInformationQueryVo.getStatus());
+        if(StringUtils.isNotNull(ringScanInformationQueryVo.getOrderNumber())){
+            ringScanInformationFirst.setOrderNumber(ringScanInformationQueryVo.getOrderNumber());
+        }
+        //分页数据
+        List<RingScanInformationFirst> ringScanInformationFirsts = ringScanInformationFirstMapper.selectRingScanInformationFirstList(ringScanInformationFirst);
+        if(ringScanInformationFirsts.size()<=0){
+            Map<String, List<RingScanInformationLogVo>> stringListMap=new HashMap<>();
+            return AjaxResult.success("查询成功",stringListMap).put("total",0);
+        }
+        List<String> orderNumberListString = ringScanInformationFirsts.parallelStream().map(RingScanInformationFirst::getOrderNumber).collect(Collectors.toList());
+
+        Map<String, List<RingScanInformationLogVo>> stringListMap = ringScanInformationService.SelectRingScanInformationLog(orderNumberListString);
+        //总条数
+        long total = new PageInfo(ringScanInformationFirsts).getTotal();
+        //分页数据返回
+        return AjaxResult.success("查询成功",stringListMap).put("total",total);
+    }
+
 
     //@PreAuthorize("@ss.hasPermi('ringScanInformation:information:list')")
     @Anonymous

+ 106 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/controller/RingScanInformationFirstController.java

@@ -0,0 +1,106 @@
+package com.zkqy.amichi.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.zkqy.common.annotation.Log;
+import com.zkqy.common.core.controller.BaseController;
+import com.zkqy.common.core.domain.AjaxResult;
+import com.zkqy.common.core.page.TableDataInfo;
+import com.zkqy.common.enums.BusinessType;
+import com.zkqy.common.utils.poi.ExcelUtil;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.zkqy.amichi.domain.RingScanInformationFirst;
+import com.zkqy.amichi.service.IRingScanInformationFirstService;
+
+
+/**
+ * 第一次扫描信息记录Controller
+ * 
+ * @author ruoyi
+ * @date 2024-11-15
+ */
+@RestController
+@RequestMapping("/ringScanInformationFirst/first")
+public class RingScanInformationFirstController extends BaseController
+{
+    @Autowired
+    private IRingScanInformationFirstService ringScanInformationFirstService;
+
+    /**
+     * 查询第一次扫描信息记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('ringScanInformationFirst:first:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(RingScanInformationFirst ringScanInformationFirst)
+    {
+        startPage();
+        List<RingScanInformationFirst> list = ringScanInformationFirstService.selectRingScanInformationFirstList(ringScanInformationFirst);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出第一次扫描信息记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('ringScanInformationFirst:first:export')")
+    @Log(title = "第一次扫描信息记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, RingScanInformationFirst ringScanInformationFirst)
+    {
+        List<RingScanInformationFirst> list = ringScanInformationFirstService.selectRingScanInformationFirstList(ringScanInformationFirst);
+        ExcelUtil<RingScanInformationFirst> util = new ExcelUtil<RingScanInformationFirst>(RingScanInformationFirst.class);
+        util.exportExcel(response, list, "第一次扫描信息记录数据");
+    }
+
+    /**
+     * 获取第一次扫描信息记录详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('ringScanInformationFirst:first:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(ringScanInformationFirstService.selectRingScanInformationFirstById(id));
+    }
+
+    /**
+     * 新增第一次扫描信息记录
+     */
+    @PreAuthorize("@ss.hasPermi('ringScanInformationFirst:first:add')")
+    @Log(title = "第一次扫描信息记录", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody RingScanInformationFirst ringScanInformationFirst)
+    {
+        return toAjax(ringScanInformationFirstService.insertRingScanInformationFirst(ringScanInformationFirst));
+    }
+
+    /**
+     * 修改第一次扫描信息记录
+     */
+    @PreAuthorize("@ss.hasPermi('ringScanInformationFirst:first:edit')")
+    @Log(title = "第一次扫描信息记录", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody RingScanInformationFirst ringScanInformationFirst)
+    {
+        return toAjax(ringScanInformationFirstService.updateRingScanInformationFirst(ringScanInformationFirst));
+    }
+
+    /**
+     * 删除第一次扫描信息记录
+     */
+    @PreAuthorize("@ss.hasPermi('ringScanInformationFirst:first:remove')")
+    @Log(title = "第一次扫描信息记录", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(ringScanInformationFirstService.deleteRingScanInformationFirstByIds(ids));
+    }
+}

+ 120 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/controller/RingTerminalController.java

@@ -0,0 +1,120 @@
+package com.zkqy.amichi.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.zkqy.common.annotation.Log;
+import com.zkqy.common.core.controller.BaseController;
+import com.zkqy.common.core.domain.AjaxResult;
+import com.zkqy.common.core.page.TableDataInfo;
+import com.zkqy.common.enums.BusinessType;
+import com.zkqy.common.utils.poi.ExcelUtil;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.zkqy.amichi.domain.RingTerminal;
+import com.zkqy.amichi.service.IRingTerminalService;
+
+
+/**
+ * 指环终端Controller
+ * 
+ * @author zkqy
+ * @date 2024-11-14
+ */
+@RestController
+@RequestMapping("/RingTerminal/terminal")
+public class RingTerminalController extends BaseController
+{
+
+    @Autowired
+    private IRingTerminalService ringTerminalService;
+
+    /**
+     * 查询指环终端列表
+     */
+    @PreAuthorize("@ss.hasPermi('RingTerminal:terminal:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(RingTerminal ringTerminal)
+    {
+        startPage();
+        List<RingTerminal> list = ringTerminalService.selectRingTerminalList(ringTerminal);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出指环终端列表
+     */
+    @PreAuthorize("@ss.hasPermi('RingTerminal:terminal:export')")
+    @Log(title = "指环终端", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, RingTerminal ringTerminal)
+    {
+        List<RingTerminal> list = ringTerminalService.selectRingTerminalList(ringTerminal);
+        ExcelUtil<RingTerminal> util = new ExcelUtil<RingTerminal>(RingTerminal.class);
+        util.exportExcel(response, list, "指环终端数据");
+    }
+
+    /**
+     * 获取指环终端详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('RingTerminal:terminal:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(ringTerminalService.selectRingTerminalById(id));
+    }
+
+    /**
+     * 新增指环终端
+     */
+    @PreAuthorize("@ss.hasPermi('RingTerminal:terminal:add')")
+    @Log(title = "指环终端", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody RingTerminal ringTerminal)
+    {
+        return toAjax(ringTerminalService.insertRingTerminal(ringTerminal));
+    }
+
+    /**
+     * 修改指环终端
+     */
+    @PreAuthorize("@ss.hasPermi('RingTerminal:terminal:edit')")
+    @Log(title = "指环终端", businessType = BusinessType.UPDATE)
+    @GetMapping("/getQrCodeToRing/img")
+    public AjaxResult getQrCodeToRing()
+    {
+        String qrCodeToRing = ringTerminalService.getQrCodeToRing();
+        return AjaxResult.success("请求成功",qrCodeToRing);
+    }
+
+    /**
+     * 修改指环终端
+     */
+    @PreAuthorize("@ss.hasPermi('RingTerminal:terminal:edit')")
+    @Log(title = "指环终端", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody RingTerminal ringTerminal)
+    {
+        return toAjax(ringTerminalService.updateRingTerminal(ringTerminal));
+    }
+
+    /**
+     * 删除指环终端
+     */
+    @PreAuthorize("@ss.hasPermi('RingTerminal:terminal:remove')")
+    @Log(title = "指环终端", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(ringTerminalService.deleteRingTerminalByIds(ids));
+    }
+}

+ 8 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/controller/StationInformationController.java

@@ -84,6 +84,14 @@ public class StationInformationController extends BaseController
     }
 
 
+    @Anonymous
+    @GetMapping("/sweepingMaterial")
+    @ApiOperation(value = "指环扫描产品信息")
+    public String sweepingMaterial(@RequestParam("productNumber") String productNumber,@RequestParam("gxm")String gxm)
+    {
+        return stationInformationService.sweepingMaterial(productNumber,gxm);
+    }
+
     /**
      * 获取工位信息详细信息
      */

+ 6 - 6
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/controller/TeamInformationController.java

@@ -38,12 +38,12 @@ public class TeamInformationController extends BaseController
     @Autowired
     private ITeamInformationService teamInformationService;
 
-/**
- * 查询班组信息列表
- */
-//@PreAuthorize("@ss.hasPermi('amichi:teaminformation:list')")
-@GetMapping("/list")
-@ApiOperation(value = "查询班组信息列表")
+    /**
+     * 查询班组信息列表
+     */
+    //@PreAuthorize("@ss.hasPermi('amichi:teaminformation:list')")
+    @GetMapping("/list")
+    @ApiOperation(value = "查询班组信息列表")
     public TableDataInfo list(TeamInformation teamInformation)
     {
         startPage();

+ 7 - 4
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/controller/TerminalInformationController.java

@@ -1,7 +1,9 @@
 package com.zkqy.amichi.controller;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletResponse;
 
@@ -61,14 +63,15 @@ public class TerminalInformationController extends BaseController
     @GetMapping("/listString")
     @Anonymous
     @ApiOperation(value = "查询终端信息列表")
-    public List<String> listString(TerminalInformation terminalInformation)
+    public  Map<String, String> listString(TerminalInformation terminalInformation)
     {
         List<TerminalInformation> list = terminalInformationService.selectTerminalInformationList(terminalInformation);
         if(list.size()>0){
-            List<String> collect = list.stream().map(TerminalInformation::getStationName).collect(Collectors.toList());
-            return collect;
+//            List<String> collect = list.stream().map(TerminalInformation::getStationName).collect(Collectors.toMap());
+            Map<String, String> collect1 = list.stream().collect(Collectors.toMap(TerminalInformation::getStationName, TerminalInformation::getPersonnelName));
+            return collect1;
         }else {
-            return new ArrayList<>();
+            return new HashMap<>();
         }
     }
 

+ 125 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/domain/HandheldTerminal.java

@@ -0,0 +1,125 @@
+package com.zkqy.amichi.domain;
+
+import com.zkqy.common.annotation.Excel;
+import com.zkqy.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+
+/**
+ * 扫码扣料日志对象 handheld_terminal
+ * 
+ * @author zkqy
+ * @date 2024-11-14
+ */
+public class HandheldTerminal extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long id;
+
+    /** 终端编号 */
+    @Excel(name = "终端编号")
+    private String handheldTerminalNumber;
+
+    /** 终端名称 */
+    @Excel(name = "终端名称")
+    private String handheldTerminalName;
+
+    /** 备注 */
+    @Excel(name = "备注")
+    private String remarks;
+
+    /** 创建者id  */
+    @Excel(name = "创建者id ")
+    private Long createById;
+
+    /** 更新者id */
+    @Excel(name = "更新者id")
+    private Long updateById;
+
+    /** 删除标志(0代表存在 1代表删除) */
+    private String delFlag;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setHandheldTerminalNumber(String handheldTerminalNumber) 
+    {
+        this.handheldTerminalNumber = handheldTerminalNumber;
+    }
+
+    public String getHandheldTerminalNumber() 
+    {
+        return handheldTerminalNumber;
+    }
+    public void setHandheldTerminalName(String handheldTerminalName) 
+    {
+        this.handheldTerminalName = handheldTerminalName;
+    }
+
+    public String getHandheldTerminalName() 
+    {
+        return handheldTerminalName;
+    }
+    public void setRemarks(String remarks) 
+    {
+        this.remarks = remarks;
+    }
+
+    public String getRemarks() 
+    {
+        return remarks;
+    }
+    public void setCreateById(Long createById) 
+    {
+        this.createById = createById;
+    }
+
+    public Long getCreateById() 
+    {
+        return createById;
+    }
+    public void setUpdateById(Long updateById) 
+    {
+        this.updateById = updateById;
+    }
+
+    public Long getUpdateById() 
+    {
+        return updateById;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("handheldTerminalNumber", getHandheldTerminalNumber())
+            .append("handheldTerminalName", getHandheldTerminalName())
+            .append("remarks", getRemarks())
+            .append("createById", getCreateById())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateById", getUpdateById())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("delFlag", getDelFlag())
+            .toString();
+    }
+}

+ 469 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/domain/MaterialRetentionLog.java

@@ -0,0 +1,469 @@
+package com.zkqy.amichi.domain;
+
+import com.zkqy.common.annotation.Excel;
+import com.zkqy.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+
+/**
+ * 扫码扣料日志对象 material_retention_log
+ * 
+ * @author ruoyi
+ * @date 2024-11-13
+ */
+public class MaterialRetentionLog extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long id;
+
+    private  String  process;
+
+
+
+    /** 物料编码 */
+    @Excel(name = "物料编码")
+    private String materialCode;
+
+    /** 物料名称 */
+    @Excel(name = "物料名称")
+    private String materialName;
+
+    /** 规格 */
+    @Excel(name = "规格")
+    private String specification;
+
+    /**流转卡序列号*/
+    @Excel(name = "流转卡序列号")
+    private String flowSequenceNumber;
+
+
+
+    /** 型号 */
+    @Excel(name = "型号")
+    private String model;
+
+    /** 单位 */
+    @Excel(name = "单位")
+    private String unit;
+
+    /** 实发数量 */
+    @Excel(name = "实发数量")
+    private String actualQuantityIssued;
+
+
+    @Excel(name = "产品编码")
+    private String productCode;
+
+    @Excel(name = "产品名称")
+    private String productName;
+
+
+    @Excel(name = "型号")
+    private String productModel;
+
+    public String getProductModel() {
+        return productModel;
+    }
+
+    public void setProductModel(String productModel) {
+        this.productModel = productModel;
+    }
+
+    @Excel(name = "规格")
+    private String productSpecification;
+
+
+
+    /** 发货仓库 */
+    @Excel(name = "发货仓库")
+    private String deliveryWarehouse;
+
+    /** 仓库仓库编码 */
+    @Excel(name = "仓库仓库编码")
+    private String ckNumber;
+
+    /** 单据备注 */
+    @Excel(name = "单据备注")
+    private String documentRemarks;
+
+    /** 单据类型 */
+    @Excel(name = "单据类型")
+    private String documentType;
+
+    /** 库存组织 */
+    @Excel(name = "库存组织")
+    private String inventoryOrganization;
+
+    /** 库存组织 */
+    @Excel(name = "库存组织")
+    private String receivingTissue;
+
+    /** 库存方向 */
+    @Excel(name = "库存方向")
+    private String inventoryDirection;
+
+    /** 出库日期 */
+    @Excel(name = "出库日期")
+    private String dateOfDelivery;
+
+    /** 领料部门 */
+    @Excel(name = "领料部门")
+    private String materialsRequisitionDepartment;
+
+    /** 领料人 */
+    @Excel(name = "领料人")
+    private String materialTaker;
+
+    /** 业务类型 */
+    @Excel(name = "业务类型")
+    private String businessType;
+
+    /** 货主类型 */
+    @Excel(name = "货主类型")
+    private String ownerType;
+
+    /** 货主 */
+    @Excel(name = "货主")
+    private String owner;
+
+    /** 单据状态 */
+    @Excel(name = "单据状态")
+    private String documentStatus;
+
+    /** 明细备注 */
+    @Excel(name = "明细备注")
+    private String detailedRemarks;
+
+    /** 创建者id  */
+    @Excel(name = "创建者id ")
+    private Long createById;
+
+    /** 更新者id */
+    @Excel(name = "更新者id")
+    private Long updateById;
+
+    @Excel(name = "子项类型")
+    private String materialType;
+
+    public String getMaterialType() {
+        return materialType;
+    }
+
+    public void setMaterialType(String materialType) {
+        this.materialType = materialType;
+    }
+
+    /** 删除标志(0代表存在 2代表删除) */
+    private String delFlag;
+
+    public String getProcess() {
+        return process;
+    }
+
+    public void setProcess(String process) {
+        this.process = process;
+    }
+    public MaterialRetentionLog(String productModel) {
+        this.productModel = productModel;
+    }
+
+    public MaterialRetentionLog() {
+    }
+
+    public String getFlowSequenceNumber() {
+        return flowSequenceNumber;
+    }
+
+    public void setFlowSequenceNumber(String flowSequenceNumber) {
+        this.flowSequenceNumber = flowSequenceNumber;
+    }
+
+    public String getProductCode() {
+        return productCode;
+    }
+
+    public void setProductCode(String productCode) {
+        this.productCode = productCode;
+    }
+
+    public String getProductName() {
+        return productName;
+    }
+
+    public void setProductName(String productName) {
+        this.productName = productName;
+    }
+
+
+
+    public String getProductSpecification() {
+        return productSpecification;
+    }
+
+    public void setProductSpecification(String productSpecification) {
+        this.productSpecification = productSpecification;
+    }
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setMaterialCode(String materialCode) 
+    {
+        this.materialCode = materialCode;
+    }
+
+    public String getMaterialCode() 
+    {
+        return materialCode;
+    }
+    public void setMaterialName(String materialName) 
+    {
+        this.materialName = materialName;
+    }
+
+    public String getMaterialName() 
+    {
+        return materialName;
+    }
+    public void setSpecification(String specification) 
+    {
+        this.specification = specification;
+    }
+
+    public String getSpecification() 
+    {
+        return specification;
+    }
+    public void setModel(String model) 
+    {
+        this.model = model;
+    }
+
+    public String getModel() 
+    {
+        return model;
+    }
+    public void setUnit(String unit) 
+    {
+        this.unit = unit;
+    }
+
+    public String getUnit() 
+    {
+        return unit;
+    }
+    public void setActualQuantityIssued(String actualQuantityIssued) 
+    {
+        this.actualQuantityIssued = actualQuantityIssued;
+    }
+
+    public String getActualQuantityIssued() 
+    {
+        return actualQuantityIssued;
+    }
+    public void setDeliveryWarehouse(String deliveryWarehouse) 
+    {
+        this.deliveryWarehouse = deliveryWarehouse;
+    }
+
+    public String getDeliveryWarehouse() 
+    {
+        return deliveryWarehouse;
+    }
+    public void setCkNumber(String ckNumber) 
+    {
+        this.ckNumber = ckNumber;
+    }
+
+    public String getCkNumber() 
+    {
+        return ckNumber;
+    }
+    public void setDocumentRemarks(String documentRemarks) 
+    {
+        this.documentRemarks = documentRemarks;
+    }
+
+    public String getDocumentRemarks() 
+    {
+        return documentRemarks;
+    }
+    public void setDocumentType(String documentType) 
+    {
+        this.documentType = documentType;
+    }
+
+    public String getDocumentType() 
+    {
+        return documentType;
+    }
+    public void setInventoryOrganization(String inventoryOrganization) 
+    {
+        this.inventoryOrganization = inventoryOrganization;
+    }
+
+    public String getInventoryOrganization() 
+    {
+        return inventoryOrganization;
+    }
+    public void setReceivingTissue(String receivingTissue) 
+    {
+        this.receivingTissue = receivingTissue;
+    }
+
+    public String getReceivingTissue() 
+    {
+        return receivingTissue;
+    }
+    public void setInventoryDirection(String inventoryDirection) 
+    {
+        this.inventoryDirection = inventoryDirection;
+    }
+
+    public String getInventoryDirection() 
+    {
+        return inventoryDirection;
+    }
+    public void setDateOfDelivery(String dateOfDelivery) 
+    {
+        this.dateOfDelivery = dateOfDelivery;
+    }
+
+    public String getDateOfDelivery() 
+    {
+        return dateOfDelivery;
+    }
+    public void setMaterialsRequisitionDepartment(String materialsRequisitionDepartment) 
+    {
+        this.materialsRequisitionDepartment = materialsRequisitionDepartment;
+    }
+
+    public String getMaterialsRequisitionDepartment() 
+    {
+        return materialsRequisitionDepartment;
+    }
+    public void setMaterialTaker(String materialTaker) 
+    {
+        this.materialTaker = materialTaker;
+    }
+
+    public String getMaterialTaker() 
+    {
+        return materialTaker;
+    }
+    public void setBusinessType(String businessType) 
+    {
+        this.businessType = businessType;
+    }
+
+    public String getBusinessType() 
+    {
+        return businessType;
+    }
+    public void setOwnerType(String ownerType) 
+    {
+        this.ownerType = ownerType;
+    }
+
+    public String getOwnerType() 
+    {
+        return ownerType;
+    }
+    public void setOwner(String owner) 
+    {
+        this.owner = owner;
+    }
+
+    public String getOwner() 
+    {
+        return owner;
+    }
+    public void setDocumentStatus(String documentStatus) 
+    {
+        this.documentStatus = documentStatus;
+    }
+
+    public String getDocumentStatus() 
+    {
+        return documentStatus;
+    }
+    public void setDetailedRemarks(String detailedRemarks) 
+    {
+        this.detailedRemarks = detailedRemarks;
+    }
+
+    public String getDetailedRemarks() 
+    {
+        return detailedRemarks;
+    }
+    public void setCreateById(Long createById) 
+    {
+        this.createById = createById;
+    }
+
+    public Long getCreateById() 
+    {
+        return createById;
+    }
+    public void setUpdateById(Long updateById) 
+    {
+        this.updateById = updateById;
+    }
+
+    public Long getUpdateById() 
+    {
+        return updateById;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("materialCode", getMaterialCode())
+            .append("materialName", getMaterialName())
+            .append("specification", getSpecification())
+            .append("model", getModel())
+            .append("unit", getUnit())
+            .append("actualQuantityIssued", getActualQuantityIssued())
+            .append("deliveryWarehouse", getDeliveryWarehouse())
+            .append("ckNumber", getCkNumber())
+            .append("documentRemarks", getDocumentRemarks())
+            .append("documentType", getDocumentType())
+            .append("inventoryOrganization", getInventoryOrganization())
+            .append("receivingTissue", getReceivingTissue())
+            .append("inventoryDirection", getInventoryDirection())
+            .append("dateOfDelivery", getDateOfDelivery())
+            .append("materialsRequisitionDepartment", getMaterialsRequisitionDepartment())
+            .append("materialTaker", getMaterialTaker())
+            .append("businessType", getBusinessType())
+            .append("ownerType", getOwnerType())
+            .append("owner", getOwner())
+            .append("documentStatus", getDocumentStatus())
+            .append("detailedRemarks", getDetailedRemarks())
+            .append("createById", getCreateById())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateById", getUpdateById())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("delFlag", getDelFlag())
+            .toString();
+    }
+}

+ 125 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/domain/ProcedureList.java

@@ -0,0 +1,125 @@
+package com.zkqy.amichi.domain;
+
+import com.zkqy.common.annotation.Excel;
+import com.zkqy.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+
+/**
+ * 工序列表对象 procedure_list
+ * 
+ * @author ruoyi
+ * @date 2024-11-14
+ */
+public class ProcedureList extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long id;
+
+    /** 工序编号 */
+    @Excel(name = "工序编号")
+    private String procedureNumber;
+
+    /** 工序名称 */
+    @Excel(name = "工序名称")
+    private String procedurName;
+
+    /** 备注 */
+    @Excel(name = "备注")
+    private String remarks;
+
+    /** 创建者id  */
+    @Excel(name = "创建者id ")
+    private Long createById;
+
+    /** 更新者id */
+    @Excel(name = "更新者id")
+    private Long updateById;
+
+    /** 删除标志(0代表存在 1代表删除) */
+    private String delFlag;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setProcedureNumber(String procedureNumber) 
+    {
+        this.procedureNumber = procedureNumber;
+    }
+
+    public String getProcedureNumber() 
+    {
+        return procedureNumber;
+    }
+    public void setProcedurName(String procedurName) 
+    {
+        this.procedurName = procedurName;
+    }
+
+    public String getProcedurName() 
+    {
+        return procedurName;
+    }
+    public void setRemarks(String remarks) 
+    {
+        this.remarks = remarks;
+    }
+
+    public String getRemarks() 
+    {
+        return remarks;
+    }
+    public void setCreateById(Long createById) 
+    {
+        this.createById = createById;
+    }
+
+    public Long getCreateById() 
+    {
+        return createById;
+    }
+    public void setUpdateById(Long updateById) 
+    {
+        this.updateById = updateById;
+    }
+
+    public Long getUpdateById() 
+    {
+        return updateById;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("procedureNumber", getProcedureNumber())
+            .append("procedurName", getProcedurName())
+            .append("remarks", getRemarks())
+            .append("createById", getCreateById())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateById", getUpdateById())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("delFlag", getDelFlag())
+            .toString();
+    }
+}

+ 61 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/domain/RingScanInformation.java

@@ -22,6 +22,11 @@ public class RingScanInformation extends BaseEntity
     /** 主键 */
     private Long id;
 
+    /** 扫描人 */
+    private String personnelName;
+
+
+
     /** 设备编号 */
     @Excel(name = "设备编号")
     private String deviceNumber;
@@ -44,6 +49,62 @@ public class RingScanInformation extends BaseEntity
     @Excel(name = "原生编号")
     private String nativeNumbering;
 
+    /** 工序编号 */
+    @Excel(name = "工序编号")
+    private String process;
+
+
+    /** 工序名称 */
+    @Excel(name = "工序名称")
+    private String processName;
+
+    /** 工序名称 */
+    @Excel(name = "工序名称")
+    private String orderNumber;
+
+
+    public String getProductionOrderNumber() {
+        return productionOrderNumber;
+    }
+
+    public String getOrderNumber() {
+        return orderNumber;
+    }
+
+    public void setOrderNumber(String orderNumber) {
+        this.orderNumber = orderNumber;
+    }
+
+    public void setProductionOrderNumber(String productionOrderNumber) {
+        this.productionOrderNumber = productionOrderNumber;
+    }
+
+    /** 工序名称 */
+    @Excel(name = "工序名称")
+    private String productionOrderNumber;
+
+    public String getProcess() {
+        return process;
+    }
+
+    public void setProcess(String process) {
+        this.process = process;
+    }
+
+    public String getProcessName() {
+        return processName;
+    }
+
+    public void setProcessName(String processName) {
+        this.processName = processName;
+    }
+
+    public String getPersonnelName() {
+        return personnelName;
+    }
+    public void setPersonnelName(String personnelName) {
+        this.personnelName = personnelName;
+    }
     public String getNativeNumbering() {
         return nativeNumbering;
     }

+ 144 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/domain/RingScanInformationFirst.java

@@ -0,0 +1,144 @@
+package com.zkqy.amichi.domain;
+
+import com.zkqy.common.annotation.Excel;
+import com.zkqy.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.time.LocalDateTime;
+
+
+/**
+ * 第一次扫描信息记录对象 ring_scan_information_first
+ * 
+ * @author ruoyi
+ * @date 2024-11-15
+ */
+public class RingScanInformationFirst extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+
+    /** 主键 */
+    private Long id;
+
+    /** 订单号 */
+    @Excel(name = "订单号")
+    private String orderNumber;
+
+
+    /** 订单号 */
+    @Excel(name = "总数量")
+    private String totalQuantity;
+
+    /** 生产订单号 */
+    @Excel(name = "生产订单号")
+    private String productionOrderNumber;
+
+    /** 0:进行中,已完成 */
+    @Excel(name = "0:进行中,1已完成")
+    private String status;
+
+    /** 开始时间 */
+    @Excel(name = "开始时间")
+    private LocalDateTime startTime;
+
+    public LocalDateTime getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(LocalDateTime startTime) {
+        this.startTime = startTime;
+    }
+
+    public LocalDateTime getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(LocalDateTime endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getTotalQuantity() {
+        return totalQuantity;
+    }
+
+    public void setTotalQuantity(String totalQuantity) {
+        this.totalQuantity = totalQuantity;
+    }
+    public String getPackingQuantity() {
+        return packingQuantity;
+    }
+
+    public void setPackingQuantity(String packingQuantity) {
+        this.packingQuantity = packingQuantity;
+    }
+
+    public String getInspectionQuantity() {
+        return inspectionQuantity;
+    }
+
+    public void setInspectionQuantity(String inspectionQuantity) {
+        this.inspectionQuantity = inspectionQuantity;
+    }
+
+    /** 结束时间 */
+    @Excel(name = "结束时间")
+    private LocalDateTime endTime;
+
+    /** 包装数量 */
+    @Excel(name = "包装数量")
+    private String packingQuantity;
+
+    /** 检验数量 */
+    @Excel(name = "检验数量")
+    private String inspectionQuantity;
+
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setOrderNumber(String orderNumber) 
+    {
+        this.orderNumber = orderNumber;
+    }
+
+    public String getOrderNumber() 
+    {
+        return orderNumber;
+    }
+    public void setProductionOrderNumber(String productionOrderNumber) 
+    {
+        this.productionOrderNumber = productionOrderNumber;
+    }
+
+    public String getProductionOrderNumber() 
+    {
+        return productionOrderNumber;
+    }
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("orderNumber", getOrderNumber())
+            .append("productionOrderNumber", getProductionOrderNumber())
+            .append("status", getStatus())
+            .toString();
+    }
+}

+ 125 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/domain/RingTerminal.java

@@ -0,0 +1,125 @@
+package com.zkqy.amichi.domain;
+
+import com.zkqy.common.annotation.Excel;
+import com.zkqy.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+
+/**
+ * 指环终端对象 ring_terminal
+ * 
+ * @author zkqy
+ * @date 2024-11-14
+ */
+public class RingTerminal extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long id;
+
+    /** 指环编号 */
+    @Excel(name = "指环编号")
+    private String handheldTerminalNumber;
+
+    /** 指环名称 */
+    @Excel(name = "指环名称")
+    private String handheldTerminalName;
+
+    /** 备注 */
+    @Excel(name = "备注")
+    private String remarks;
+
+    /** 创建者id  */
+    @Excel(name = "创建者id ")
+    private Long createById;
+
+    /** 更新者id */
+    @Excel(name = "更新者id")
+    private Long updateById;
+
+    /** 删除标志(0代表存在 1代表删除) */
+    private String delFlag;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setHandheldTerminalNumber(String handheldTerminalNumber) 
+    {
+        this.handheldTerminalNumber = handheldTerminalNumber;
+    }
+
+    public String getHandheldTerminalNumber() 
+    {
+        return handheldTerminalNumber;
+    }
+    public void setHandheldTerminalName(String handheldTerminalName) 
+    {
+        this.handheldTerminalName = handheldTerminalName;
+    }
+
+    public String getHandheldTerminalName() 
+    {
+        return handheldTerminalName;
+    }
+    public void setRemarks(String remarks) 
+    {
+        this.remarks = remarks;
+    }
+
+    public String getRemarks() 
+    {
+        return remarks;
+    }
+    public void setCreateById(Long createById) 
+    {
+        this.createById = createById;
+    }
+
+    public Long getCreateById() 
+    {
+        return createById;
+    }
+    public void setUpdateById(Long updateById) 
+    {
+        this.updateById = updateById;
+    }
+
+    public Long getUpdateById() 
+    {
+        return updateById;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("handheldTerminalNumber", getHandheldTerminalNumber())
+            .append("handheldTerminalName", getHandheldTerminalName())
+            .append("remarks", getRemarks())
+            .append("createById", getCreateById())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateById", getUpdateById())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("delFlag", getDelFlag())
+            .toString();
+    }
+}

+ 46 - 1
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/domain/TerminalInformation.java

@@ -22,6 +22,21 @@ public class TerminalInformation extends BaseEntity
     @Excel(name = "终端编号")
     private String terminalId;
 
+    /** 终端编号 */
+    @Excel(name = "终端名称")
+    private String terminalName;
+
+
+    /** 终端编号 */
+    @Excel(name = "工序信息")
+    private String process;
+
+
+    /** 终端编号 */
+    @Excel(name = "工序名称")
+    private String processName;
+
+
     /** 设备名称 */
     @Excel(name = "设备名称")
     private String stationName;
@@ -53,7 +68,25 @@ public class TerminalInformation extends BaseEntity
     @Excel(name = "任务编码")
     private String taskProcessKey;
 
-    public void setId(Long id) 
+    @Excel(name = "人员姓名")
+    private  String  personnelName;
+
+    public String getPersonnelName() {
+        return personnelName;
+    }
+
+    public void setPersonnelName(String personnelName) {
+        this.personnelName = personnelName;
+    }
+
+    public String getProcess() {
+        return process;
+    }
+
+    public void setProcess(String process) {
+        this.process = process;
+    }
+    public void setId(Long id)
     {
         this.id = id;
     }
@@ -75,7 +108,13 @@ public class TerminalInformation extends BaseEntity
     {
         this.stationName = stationName;
     }
+    public String getProcessName() {
+        return processName;
+    }
 
+    public void setProcessName(String processName) {
+        this.processName = processName;
+    }
     public String getStationName() 
     {
         return stationName;
@@ -84,7 +123,13 @@ public class TerminalInformation extends BaseEntity
     {
         this.deviceId = deviceId;
     }
+    public String getTerminalName() {
+        return terminalName;
+    }
 
+    public void setTerminalName(String terminalName) {
+        this.terminalName = terminalName;
+    }
     public String getDeviceId() 
     {
         return deviceId;

+ 117 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/domain/vo/RingScanInformationLogVo.java

@@ -0,0 +1,117 @@
+package com.zkqy.amichi.domain.vo;
+
+import com.zkqy.common.core.domain.BaseEntity;
+
+public class RingScanInformationLogVo extends BaseEntity {
+
+    private   String  id;
+
+    private  String  count;
+
+    private  String  processName;
+
+    private  String   nativeNumbering;
+
+    private  String   scanningTime;
+    private  String   orderNumber;
+
+    private  String   totalQuantity;
+
+
+
+    private  String   sort;
+
+    private  String   status;
+
+    private  String   startTime;
+
+    private  String  endTime;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getTotalQuantity() {
+        return totalQuantity;
+    }
+
+    public void setTotalQuantity(String totalQuantity) {
+        this.totalQuantity = totalQuantity;
+    }
+
+    public String getOrderNumber() {
+        return orderNumber;
+    }
+
+    public void setOrderNumber(String orderNumber) {
+        this.orderNumber = orderNumber;
+    }
+
+    public String getCount() {
+        return count;
+    }
+
+    public void setCount(String count) {
+        this.count = count;
+    }
+
+    public String getProcessName() {
+        return processName;
+    }
+
+    public void setProcessName(String processName) {
+        this.processName = processName;
+    }
+
+    public String getNativeNumbering() {
+        return nativeNumbering;
+    }
+
+    public void setNativeNumbering(String nativeNumbering) {
+        this.nativeNumbering = nativeNumbering;
+    }
+
+    public String getScanningTime() {
+        return scanningTime;
+    }
+
+    public void setScanningTime(String scanningTime) {
+        this.scanningTime = scanningTime;
+    }
+
+    public String getSort() {
+        return sort;
+    }
+
+    public void setSort(String sort) {
+        this.sort = sort;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+}

+ 26 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/domain/vo/RingScanInformationQueryVo.java

@@ -0,0 +1,26 @@
+package com.zkqy.amichi.domain.vo;
+
+import com.zkqy.common.core.domain.BaseEntity;
+
+public class RingScanInformationQueryVo extends BaseEntity {
+    //订单号
+    private  String  orderNumber;
+
+    private  String   status;
+
+    public String getOrderNumber() {
+        return orderNumber;
+    }
+
+    public void setOrderNumber(String orderNumber) {
+        this.orderNumber = orderNumber;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+}

+ 0 - 2
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/jd/controller/JdProductionBomsController.java

@@ -22,8 +22,6 @@ public class JdProductionBomsController {
         return list;
     }
 
-
-
     @Anonymous
     @GetMapping("/jdProductionBomsDetailsPull")
     public AjaxResult jdProductionBomsDetailsPull()

+ 401 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/jd/domain/MaterialRetentionLogVo.java

@@ -0,0 +1,401 @@
+package com.zkqy.amichi.jd.domain;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import com.zkqy.common.annotation.Excel;
+import com.zkqy.common.core.domain.BaseEntity;
+
+public class MaterialRetentionLogVo extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long id;
+
+    @Excel(name = "产品编码")
+    @JSONField(name = "FMaterialID.FNumber")
+    private String productCode;
+
+    @Excel(name = "工序")
+    private  String  process;
+
+    public String getProcess() {
+        return process;
+    }
+
+    public void setProcess(String process) {
+        this.process = process;
+    }
+    @Excel(name = "流转序列号")
+    private String flowSequenceNumber;
+
+    public String getFlowSequenceNumber() {
+        return flowSequenceNumber;
+    }
+
+    public void setFlowSequenceNumber(String flowSequenceNumber) {
+        this.flowSequenceNumber = flowSequenceNumber;
+    }
+
+    @Excel(name = "产品型号")
+    @JSONField(name = "FMaterialName")
+    private String productName;
+
+    @Excel(name = "型号")
+    @JSONField(name = "FMaterialModel")
+    private String productModel;
+
+    @Excel(name = "规格")
+    @JSONField(name = "FMaterialModel2")
+    private String productSpecification;
+
+
+    /** 物料编码 */
+    @Excel(name = "物料编码")
+    @JSONField(name = "FMaterialID2.FNumber")
+    private String materialCode;
+
+    /** 物料名称 */
+    @Excel(name = "物料名称")
+    @JSONField(name = "FMaterialName1")
+    private String materialName;
+
+    @Excel(name = "子项类型")
+    @JSONField(name = "FMaterialType")
+    private String materialType;
+
+    public String getMaterialType() {
+        return materialType;
+    }
+
+    public void setMaterialType(String materialType) {
+        this.materialType = materialType;
+    }
+
+    /** 规格 */
+    @Excel(name = "规格")
+    @JSONField(name = "FMaterialModel1")
+    private String specification;
+
+    /** 型号 */
+    @Excel(name = "型号")
+    @JSONField(name = "F.PONP.BaseProperty")
+    private String model;
+
+    /** 单位 */
+    @Excel(name = "单位")
+    @JSONField(name = "FUnitID2.FName")
+    private String unit;
+
+    /** 实发数量 */
+    @Excel(name = "实发数量")
+    @JSONField(name = "FNumerator")
+    private String actualQuantityIssued;
+
+
+    /** 发货仓库 */
+    @Excel(name = "发货仓库")
+    private String deliveryWarehouse;
+
+    /** 仓库仓库编码 */
+    @Excel(name = "仓库仓库编码")
+    private String ckNumber;
+
+    /** 单据备注 */
+    @Excel(name = "单据备注")
+    @JSONField(name="FDescription")
+    private String documentRemarks;
+
+    /** 单据类型 */
+    @Excel(name = "单据类型")
+    private String documentType;
+
+    /** 库存组织 */
+    @Excel(name = "库存组织")
+    private String inventoryOrganization;
+
+    /** 库存组织 */
+    @Excel(name = "库存组织")
+    private String receivingTissue;
+
+    /** 库存方向 */
+    @Excel(name = "库存方向")
+    private String inventoryDirection;
+
+    /** 出库日期 */
+    @Excel(name = "出库日期")
+    private String dateOfDelivery;
+
+    /** 领料部门 */
+    @Excel(name = "领料部门")
+    private String materialsRequisitionDepartment;
+
+    /** 领料人 */
+    @Excel(name = "领料人")
+    private String materialTaker;
+
+    /** 业务类型 */
+    @Excel(name = "业务类型")
+    private String businessType;
+
+    /** 货主类型 */
+    @Excel(name = "货主类型")
+    private String ownerType;
+
+    /** 货主 */
+    @Excel(name = "货主")
+    private String owner;
+
+    /** 单据状态 */
+    @Excel(name = "单据状态")
+    private String documentStatus;
+
+    /** 明细备注 */
+    @Excel(name = "明细备注")
+    @JSONField(name="FMEMO1")
+    private String detailedRemarks;
+
+    /** 创建者id  */
+    @Excel(name = "创建者id ")
+    private Long createById;
+
+    /** 更新者id */
+    @Excel(name = "更新者id")
+    private Long updateById;
+
+    /** 删除标志(0代表存在 2代表删除) */
+    private String delFlag;
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getProductCode() {
+        return productCode;
+    }
+
+    public void setProductCode(String productCode) {
+        this.productCode = productCode;
+    }
+
+    public String getProductName() {
+        return productName;
+    }
+
+    public void setProductName(String productName) {
+        this.productName = productName;
+    }
+
+    public String getProductModel() {
+        return productModel;
+    }
+
+    public void setProductModel(String productModel) {
+        this.productModel = productModel;
+    }
+
+    public String getProductSpecification() {
+        return productSpecification;
+    }
+
+    public void setProductSpecification(String productSpecification) {
+        this.productSpecification = productSpecification;
+    }
+
+    public String getMaterialCode() {
+        return materialCode;
+    }
+
+    public void setMaterialCode(String materialCode) {
+        this.materialCode = materialCode;
+    }
+
+    public String getMaterialName() {
+        return materialName;
+    }
+
+    public void setMaterialName(String materialName) {
+        this.materialName = materialName;
+    }
+
+    public String getSpecification() {
+        return specification;
+    }
+
+    public void setSpecification(String specification) {
+        this.specification = specification;
+    }
+
+    public String getModel() {
+        return model;
+    }
+
+    public void setModel(String model) {
+        this.model = model;
+    }
+
+    public String getUnit() {
+        return unit;
+    }
+
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
+
+    public String getActualQuantityIssued() {
+        return actualQuantityIssued;
+    }
+
+    public void setActualQuantityIssued(String actualQuantityIssued) {
+        this.actualQuantityIssued = actualQuantityIssued;
+    }
+
+    public String getDeliveryWarehouse() {
+        return deliveryWarehouse;
+    }
+
+    public void setDeliveryWarehouse(String deliveryWarehouse) {
+        this.deliveryWarehouse = deliveryWarehouse;
+    }
+
+    public String getCkNumber() {
+        return ckNumber;
+    }
+
+    public void setCkNumber(String ckNumber) {
+        this.ckNumber = ckNumber;
+    }
+
+    public String getDocumentRemarks() {
+        return documentRemarks;
+    }
+
+    public void setDocumentRemarks(String documentRemarks) {
+        this.documentRemarks = documentRemarks;
+    }
+
+    public String getDocumentType() {
+        return documentType;
+    }
+
+    public void setDocumentType(String documentType) {
+        this.documentType = documentType;
+    }
+
+    public String getInventoryOrganization() {
+        return inventoryOrganization;
+    }
+
+    public void setInventoryOrganization(String inventoryOrganization) {
+        this.inventoryOrganization = inventoryOrganization;
+    }
+
+    public String getReceivingTissue() {
+        return receivingTissue;
+    }
+
+    public void setReceivingTissue(String receivingTissue) {
+        this.receivingTissue = receivingTissue;
+    }
+
+    public String getInventoryDirection() {
+        return inventoryDirection;
+    }
+
+    public void setInventoryDirection(String inventoryDirection) {
+        this.inventoryDirection = inventoryDirection;
+    }
+
+    public String getDateOfDelivery() {
+        return dateOfDelivery;
+    }
+
+    public void setDateOfDelivery(String dateOfDelivery) {
+        this.dateOfDelivery = dateOfDelivery;
+    }
+
+    public String getMaterialsRequisitionDepartment() {
+        return materialsRequisitionDepartment;
+    }
+
+    public void setMaterialsRequisitionDepartment(String materialsRequisitionDepartment) {
+        this.materialsRequisitionDepartment = materialsRequisitionDepartment;
+    }
+
+    public String getMaterialTaker() {
+        return materialTaker;
+    }
+
+    public void setMaterialTaker(String materialTaker) {
+        this.materialTaker = materialTaker;
+    }
+
+    public String getBusinessType() {
+        return businessType;
+    }
+
+    public void setBusinessType(String businessType) {
+        this.businessType = businessType;
+    }
+
+    public String getOwnerType() {
+        return ownerType;
+    }
+
+    public void setOwnerType(String ownerType) {
+        this.ownerType = ownerType;
+    }
+
+    public String getOwner() {
+        return owner;
+    }
+
+    public void setOwner(String owner) {
+        this.owner = owner;
+    }
+
+    public String getDocumentStatus() {
+        return documentStatus;
+    }
+
+    public void setDocumentStatus(String documentStatus) {
+        this.documentStatus = documentStatus;
+    }
+
+    public String getDetailedRemarks() {
+        return detailedRemarks;
+    }
+
+    public void setDetailedRemarks(String detailedRemarks) {
+        this.detailedRemarks = detailedRemarks;
+    }
+
+    public Long getCreateById() {
+        return createById;
+    }
+
+    public void setCreateById(Long createById) {
+        this.createById = createById;
+    }
+
+    public Long getUpdateById() {
+        return updateById;
+    }
+
+    public void setUpdateById(Long updateById) {
+        this.updateById = updateById;
+    }
+
+    public String getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDelFlag(String delFlag) {
+        this.delFlag = delFlag;
+    }
+
+}

+ 63 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/mapper/HandheldTerminalMapper.java

@@ -0,0 +1,63 @@
+package com.zkqy.amichi.mapper;
+
+import java.util.List;
+import com.zkqy.amichi.domain.HandheldTerminal;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 扫码扣料日志Mapper接口
+ * 
+ * @author zkqy
+ * @date 2024-11-14
+ */
+@Mapper
+public interface HandheldTerminalMapper 
+{
+    /**
+     * 查询扫码扣料日志
+     * 
+     * @param id 扫码扣料日志主键
+     * @return 扫码扣料日志
+     */
+    public HandheldTerminal selectHandheldTerminalById(Long id);
+
+    /**
+     * 查询扫码扣料日志列表
+     * 
+     * @param handheldTerminal 扫码扣料日志
+     * @return 扫码扣料日志集合
+     */
+    public List<HandheldTerminal> selectHandheldTerminalList(HandheldTerminal handheldTerminal);
+
+    /**
+     * 新增扫码扣料日志
+     * 
+     * @param handheldTerminal 扫码扣料日志
+     * @return 结果
+     */
+    public int insertHandheldTerminal(HandheldTerminal handheldTerminal);
+
+    /**
+     * 修改扫码扣料日志
+     * 
+     * @param handheldTerminal 扫码扣料日志
+     * @return 结果
+     */
+    public int updateHandheldTerminal(HandheldTerminal handheldTerminal);
+
+    /**
+     * 删除扫码扣料日志
+     * 
+     * @param id 扫码扣料日志主键
+     * @return 结果
+     */
+    public int deleteHandheldTerminalById(Long id);
+
+    /**
+     * 批量删除扫码扣料日志
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteHandheldTerminalByIds(Long[] ids);
+}

+ 71 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/mapper/MaterialRetentionLogMapper.java

@@ -0,0 +1,71 @@
+package com.zkqy.amichi.mapper;
+
+import java.util.List;
+import com.zkqy.amichi.domain.MaterialRetentionLog;
+import com.zkqy.amichi.jd.domain.MaterialRetentionLogVo;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 扫码扣料日志Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2024-11-13
+ */
+@Mapper
+public interface MaterialRetentionLogMapper 
+{
+    /**
+     * 查询扫码扣料日志
+     * 
+     * @param id 扫码扣料日志主键
+     * @return 扫码扣料日志
+     */
+    public MaterialRetentionLog selectMaterialRetentionLogById(Long id);
+
+    /**
+     * 查询扫码扣料日志列表
+     * 
+     * @param materialRetentionLog 扫码扣料日志
+     * @return 扫码扣料日志集合
+     */
+    public List<MaterialRetentionLog> selectMaterialRetentionLogList(MaterialRetentionLog materialRetentionLog);
+
+    /**
+     * 新增扫码扣料日志
+     * 
+     * @param materialRetentionLog 扫码扣料日志
+     * @return 结果
+     */
+    public int insertMaterialRetentionLog(MaterialRetentionLog materialRetentionLog);
+
+    /**
+     * 修改扫码扣料日志
+     * 
+     * @param materialRetentionLog 扫码扣料日志
+     * @return 结果
+     */
+    public int updateMaterialRetentionLog(MaterialRetentionLog materialRetentionLog);
+
+    /**
+     * 删除扫码扣料日志
+     * 
+     * @param id 扫码扣料日志主键
+     * @return 结果
+     */
+    public int deleteMaterialRetentionLogById(Long id);
+
+    /**
+     * 批量删除扫码扣料日志
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteMaterialRetentionLogByIds(Long[] ids);
+
+    /**
+     * 批量插入扣料信息
+     * @param materialRetentionLogVos
+     * @return
+     */
+    int insertMaterialRetentionLogBatch(List<MaterialRetentionLogVo> materialRetentionLogVos);
+}

+ 63 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/mapper/ProcedureListMapper.java

@@ -0,0 +1,63 @@
+package com.zkqy.amichi.mapper;
+
+import java.util.List;
+import com.zkqy.amichi.domain.ProcedureList;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 工序列表Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2024-11-14
+ */
+@Mapper
+public interface ProcedureListMapper 
+{
+    /**
+     * 查询工序列表
+     * 
+     * @param id 工序列表主键
+     * @return 工序列表
+     */
+    public ProcedureList selectProcedureListById(Long id);
+
+    /**
+     * 查询工序列表列表
+     * 
+     * @param procedureList 工序列表
+     * @return 工序列表集合
+     */
+    public List<ProcedureList> selectProcedureListList(ProcedureList procedureList);
+
+    /**
+     * 新增工序列表
+     * 
+     * @param procedureList 工序列表
+     * @return 结果
+     */
+    public int insertProcedureList(ProcedureList procedureList);
+
+    /**
+     * 修改工序列表
+     * 
+     * @param procedureList 工序列表
+     * @return 结果
+     */
+    public int updateProcedureList(ProcedureList procedureList);
+
+    /**
+     * 删除工序列表
+     * 
+     * @param id 工序列表主键
+     * @return 结果
+     */
+    public int deleteProcedureListById(Long id);
+
+    /**
+     * 批量删除工序列表
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteProcedureListByIds(Long[] ids);
+}

+ 63 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/mapper/RingScanInformationFirstMapper.java

@@ -0,0 +1,63 @@
+package com.zkqy.amichi.mapper;
+
+import java.util.List;
+import com.zkqy.amichi.domain.RingScanInformationFirst;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 第一次扫描信息记录Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2024-11-15
+ */
+@Mapper
+public interface RingScanInformationFirstMapper 
+{
+    /**
+     * 查询第一次扫描信息记录
+     * 
+     * @param id 第一次扫描信息记录主键
+     * @return 第一次扫描信息记录
+     */
+    public RingScanInformationFirst selectRingScanInformationFirstById(Long id);
+
+    /**
+     * 查询第一次扫描信息记录列表
+     * 
+     * @param ringScanInformationFirst 第一次扫描信息记录
+     * @return 第一次扫描信息记录集合
+     */
+    public List<RingScanInformationFirst> selectRingScanInformationFirstList(RingScanInformationFirst ringScanInformationFirst);
+
+    /**
+     * 新增第一次扫描信息记录
+     * 
+     * @param ringScanInformationFirst 第一次扫描信息记录
+     * @return 结果
+     */
+    public int insertRingScanInformationFirst(RingScanInformationFirst ringScanInformationFirst);
+
+    /**
+     * 修改第一次扫描信息记录
+     * 
+     * @param ringScanInformationFirst 第一次扫描信息记录
+     * @return 结果
+     */
+    public int updateRingScanInformationFirst(RingScanInformationFirst ringScanInformationFirst);
+
+    /**
+     * 删除第一次扫描信息记录
+     * 
+     * @param id 第一次扫描信息记录主键
+     * @return 结果
+     */
+    public int deleteRingScanInformationFirstById(Long id);
+
+    /**
+     * 批量删除第一次扫描信息记录
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteRingScanInformationFirstByIds(Long[] ids);
+}

+ 9 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/mapper/RingScanInformationMapper.java

@@ -1,7 +1,10 @@
 package com.zkqy.amichi.mapper;
 
 import java.util.List;
+import java.util.Map;
+
 import com.zkqy.amichi.domain.RingScanInformation;
+import com.zkqy.amichi.domain.vo.RingScanInformationLogVo;
 import com.zkqy.amichi.domain.vo.RingScanInformationVo;
 import org.apache.ibatis.annotations.Mapper;
 
@@ -76,4 +79,10 @@ public interface RingScanInformationMapper
      * @return
      */
     RingScanInformation selectRingScanInformationListDateTimeMax(RingScanInformation ringScanInformationQuery);
+
+    /**
+     *
+     * @return
+     */
+    List<RingScanInformationLogVo>  SelectRingScanInformationLog(List<String> orderNumberListString);
 }

+ 63 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/mapper/RingTerminalMapper.java

@@ -0,0 +1,63 @@
+package com.zkqy.amichi.mapper;
+
+import java.util.List;
+import com.zkqy.amichi.domain.RingTerminal;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 指环终端Mapper接口
+ * 
+ * @author zkqy
+ * @date 2024-11-14
+ */
+@Mapper
+public interface RingTerminalMapper 
+{
+    /**
+     * 查询指环终端
+     * 
+     * @param id 指环终端主键
+     * @return 指环终端
+     */
+    public RingTerminal selectRingTerminalById(Long id);
+
+    /**
+     * 查询指环终端列表
+     * 
+     * @param ringTerminal 指环终端
+     * @return 指环终端集合
+     */
+    public List<RingTerminal> selectRingTerminalList(RingTerminal ringTerminal);
+
+    /**
+     * 新增指环终端
+     * 
+     * @param ringTerminal 指环终端
+     * @return 结果
+     */
+    public int insertRingTerminal(RingTerminal ringTerminal);
+
+    /**
+     * 修改指环终端
+     * 
+     * @param ringTerminal 指环终端
+     * @return 结果
+     */
+    public int updateRingTerminal(RingTerminal ringTerminal);
+
+    /**
+     * 删除指环终端
+     * 
+     * @param id 指环终端主键
+     * @return 结果
+     */
+    public int deleteRingTerminalById(Long id);
+
+    /**
+     * 批量删除指环终端
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteRingTerminalByIds(Long[] ids);
+}

+ 61 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/IHandheldTerminalService.java

@@ -0,0 +1,61 @@
+package com.zkqy.amichi.service;
+
+import java.util.List;
+import com.zkqy.amichi.domain.HandheldTerminal;
+
+/**
+ * 扫码扣料日志Service接口
+ * 
+ * @author zkqy
+ * @date 2024-11-14
+ */
+public interface IHandheldTerminalService 
+{
+    /**
+     * 查询扫码扣料日志
+     * 
+     * @param id 扫码扣料日志主键
+     * @return 扫码扣料日志
+     */
+    public HandheldTerminal selectHandheldTerminalById(Long id);
+
+    /**
+     * 查询扫码扣料日志列表
+     * 
+     * @param handheldTerminal 扫码扣料日志
+     * @return 扫码扣料日志集合
+     */
+    public List<HandheldTerminal> selectHandheldTerminalList(HandheldTerminal handheldTerminal);
+
+    /**
+     * 新增扫码扣料日志
+     * 
+     * @param handheldTerminal 扫码扣料日志
+     * @return 结果
+     */
+    public int insertHandheldTerminal(HandheldTerminal handheldTerminal);
+
+    /**
+     * 修改扫码扣料日志
+     * 
+     * @param handheldTerminal 扫码扣料日志
+     * @return 结果
+     */
+    public int updateHandheldTerminal(HandheldTerminal handheldTerminal);
+
+    /**
+     * 批量删除扫码扣料日志
+     * 
+     * @param ids 需要删除的扫码扣料日志主键集合
+     * @return 结果
+     */
+    public int deleteHandheldTerminalByIds(Long[] ids);
+
+    /**
+     * 删除扫码扣料日志信息
+     * 
+     * @param id 扫码扣料日志主键
+     * @return 结果
+     */
+    public int deleteHandheldTerminalById(Long id);
+}

+ 61 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/IMaterialRetentionLogService.java

@@ -0,0 +1,61 @@
+package com.zkqy.amichi.service;
+
+import java.util.List;
+import com.zkqy.amichi.domain.MaterialRetentionLog;
+
+/**
+ * 扫码扣料日志Service接口
+ * 
+ * @author ruoyi
+ * @date 2024-11-13
+ */
+public interface IMaterialRetentionLogService 
+{
+    /**
+     * 查询扫码扣料日志
+     * 
+     * @param id 扫码扣料日志主键
+     * @return 扫码扣料日志
+     */
+    public MaterialRetentionLog selectMaterialRetentionLogById(Long id);
+
+    /**
+     * 查询扫码扣料日志列表
+     * 
+     * @param materialRetentionLog 扫码扣料日志
+     * @return 扫码扣料日志集合
+     */
+    public List<MaterialRetentionLog> selectMaterialRetentionLogList(MaterialRetentionLog materialRetentionLog);
+
+    /**
+     * 新增扫码扣料日志
+     * 
+     * @param materialRetentionLog 扫码扣料日志
+     * @return 结果
+     */
+    public int insertMaterialRetentionLog(MaterialRetentionLog materialRetentionLog);
+
+    /**
+     * 修改扫码扣料日志
+     * 
+     * @param materialRetentionLog 扫码扣料日志
+     * @return 结果
+     */
+    public int updateMaterialRetentionLog(MaterialRetentionLog materialRetentionLog);
+
+    /**
+     * 批量删除扫码扣料日志
+     * 
+     * @param ids 需要删除的扫码扣料日志主键集合
+     * @return 结果
+     */
+    public int deleteMaterialRetentionLogByIds(Long[] ids);
+
+    /**
+     * 删除扫码扣料日志信息
+     * 
+     * @param id 扫码扣料日志主键
+     * @return 结果
+     */
+    public int deleteMaterialRetentionLogById(Long id);
+}

+ 61 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/IProcedureListService.java

@@ -0,0 +1,61 @@
+package com.zkqy.amichi.service;
+
+import java.util.List;
+import com.zkqy.amichi.domain.ProcedureList;
+
+/**
+ * 工序列表Service接口
+ * 
+ * @author ruoyi
+ * @date 2024-11-14
+ */
+public interface IProcedureListService 
+{
+    /**
+     * 查询工序列表
+     * 
+     * @param id 工序列表主键
+     * @return 工序列表
+     */
+    public ProcedureList selectProcedureListById(Long id);
+
+    /**
+     * 查询工序列表列表
+     * 
+     * @param procedureList 工序列表
+     * @return 工序列表集合
+     */
+    public List<ProcedureList> selectProcedureListList(ProcedureList procedureList);
+
+    /**
+     * 新增工序列表
+     * 
+     * @param procedureList 工序列表
+     * @return 结果
+     */
+    public int insertProcedureList(ProcedureList procedureList);
+
+    /**
+     * 修改工序列表
+     * 
+     * @param procedureList 工序列表
+     * @return 结果
+     */
+    public int updateProcedureList(ProcedureList procedureList);
+
+    /**
+     * 批量删除工序列表
+     * 
+     * @param ids 需要删除的工序列表主键集合
+     * @return 结果
+     */
+    public int deleteProcedureListByIds(Long[] ids);
+
+    /**
+     * 删除工序列表信息
+     * 
+     * @param id 工序列表主键
+     * @return 结果
+     */
+    public int deleteProcedureListById(Long id);
+}

+ 61 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/IRingScanInformationFirstService.java

@@ -0,0 +1,61 @@
+package com.zkqy.amichi.service;
+
+import java.util.List;
+import com.zkqy.amichi.domain.RingScanInformationFirst;
+
+/**
+ * 第一次扫描信息记录Service接口
+ * 
+ * @author ruoyi
+ * @date 2024-11-15
+ */
+public interface IRingScanInformationFirstService 
+{
+    /**
+     * 查询第一次扫描信息记录
+     * 
+     * @param id 第一次扫描信息记录主键
+     * @return 第一次扫描信息记录
+     */
+    public RingScanInformationFirst selectRingScanInformationFirstById(Long id);
+
+    /**
+     * 查询第一次扫描信息记录列表
+     * 
+     * @param ringScanInformationFirst 第一次扫描信息记录
+     * @return 第一次扫描信息记录集合
+     */
+    public List<RingScanInformationFirst> selectRingScanInformationFirstList(RingScanInformationFirst ringScanInformationFirst);
+
+    /**
+     * 新增第一次扫描信息记录
+     * 
+     * @param ringScanInformationFirst 第一次扫描信息记录
+     * @return 结果
+     */
+    public int insertRingScanInformationFirst(RingScanInformationFirst ringScanInformationFirst);
+
+    /**
+     * 修改第一次扫描信息记录
+     * 
+     * @param ringScanInformationFirst 第一次扫描信息记录
+     * @return 结果
+     */
+    public int updateRingScanInformationFirst(RingScanInformationFirst ringScanInformationFirst);
+
+    /**
+     * 批量删除第一次扫描信息记录
+     * 
+     * @param ids 需要删除的第一次扫描信息记录主键集合
+     * @return 结果
+     */
+    public int deleteRingScanInformationFirstByIds(Long[] ids);
+
+    /**
+     * 删除第一次扫描信息记录信息
+     * 
+     * @param id 第一次扫描信息记录主键
+     * @return 结果
+     */
+    public int deleteRingScanInformationFirstById(Long id);
+}

+ 11 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/IRingScanInformationService.java

@@ -1,7 +1,10 @@
 package com.zkqy.amichi.service;
 
 import java.util.List;
+import java.util.Map;
+
 import com.zkqy.amichi.domain.RingScanInformation;
+import com.zkqy.amichi.domain.vo.RingScanInformationLogVo;
 import com.zkqy.amichi.domain.vo.RingScanInformationVo;
 
 /**
@@ -20,6 +23,14 @@ public interface IRingScanInformationService
      */
     public RingScanInformation selectRingScanInformationById(Long id);
 
+
+    /**
+     * 流程列表查看
+     * @param orderNumberListString
+     * @return
+     */
+    public Map<String,List<RingScanInformationLogVo>> SelectRingScanInformationLog(List<String> orderNumberListString);
+
     /**
      * 查询指环王扫描日志信息列表
      * 

+ 68 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/IRingTerminalService.java

@@ -0,0 +1,68 @@
+package com.zkqy.amichi.service;
+
+import java.util.List;
+import com.zkqy.amichi.domain.RingTerminal;
+
+/**
+ * 指环终端Service接口
+ * 
+ * @author zkqy
+ * @date 2024-11-14
+ */
+public interface IRingTerminalService 
+{
+    /**
+     * 查询指环终端
+     * 
+     * @param id 指环终端主键
+     * @return 指环终端
+     */
+    public RingTerminal selectRingTerminalById(Long id);
+
+    /**
+     * 查询指环终端列表
+     * 
+     * @param ringTerminal 指环终端
+     * @return 指环终端集合
+     */
+    public List<RingTerminal> selectRingTerminalList(RingTerminal ringTerminal);
+
+    /**
+     * 新增指环终端
+     * 
+     * @param ringTerminal 指环终端
+     * @return 结果
+     */
+    public int insertRingTerminal(RingTerminal ringTerminal);
+
+    /**
+     * 修改指环终端
+     * 
+     * @param ringTerminal 指环终端
+     * @return 结果
+     */
+    public int updateRingTerminal(RingTerminal ringTerminal);
+
+    /**
+     * 批量删除指环终端
+     * 
+     * @param ids 需要删除的指环终端主键集合
+     * @return 结果
+     */
+    public int deleteRingTerminalByIds(Long[] ids);
+
+    /**
+     * 删除指环终端信息
+     * 
+     * @param id 指环终端主键
+     * @return 结果
+     */
+    public int deleteRingTerminalById(Long id);
+
+    /**
+     * 生成一个绑定二维码
+     * @return
+     */
+    String getQrCodeToRing();
+
+}

+ 7 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/IStationInformationService.java

@@ -74,4 +74,11 @@ public interface IStationInformationService
      * @return
      */
     String stationProductScanningRing(StationProductScanningRingVo stationProductScanningRingVo);
+
+    /**
+     * 扣料接口
+     * @param productNumber
+     * @return
+     */
+    String sweepingMaterial(String productNumber,String gxm);
 }

+ 97 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/impl/HandheldTerminalServiceImpl.java

@@ -0,0 +1,97 @@
+package com.zkqy.amichi.service.impl;
+
+import java.util.List;
+
+import com.zkqy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.zkqy.amichi.mapper.HandheldTerminalMapper;
+import com.zkqy.amichi.domain.HandheldTerminal;
+import com.zkqy.amichi.service.IHandheldTerminalService;
+
+/**
+ * 扫码扣料日志Service业务层处理
+ * 
+ * @author zkqy
+ * @date 2024-11-14
+ */
+@Service
+public class HandheldTerminalServiceImpl implements IHandheldTerminalService 
+{
+    @Autowired
+    private HandheldTerminalMapper handheldTerminalMapper;
+
+    /**
+     * 查询扫码扣料日志
+     * 
+     * @param id 扫码扣料日志主键
+     * @return 扫码扣料日志
+     */
+    @Override
+    public HandheldTerminal selectHandheldTerminalById(Long id)
+    {
+        return handheldTerminalMapper.selectHandheldTerminalById(id);
+    }
+
+    /**
+     * 查询扫码扣料日志列表
+     * 
+     * @param handheldTerminal 扫码扣料日志
+     * @return 扫码扣料日志
+     */
+    @Override
+    public List<HandheldTerminal> selectHandheldTerminalList(HandheldTerminal handheldTerminal)
+    {
+        return handheldTerminalMapper.selectHandheldTerminalList(handheldTerminal);
+    }
+
+    /**
+     * 新增扫码扣料日志
+     * 
+     * @param handheldTerminal 扫码扣料日志
+     * @return 结果
+     */
+    @Override
+    public int insertHandheldTerminal(HandheldTerminal handheldTerminal)
+    {
+        handheldTerminal.setCreateTime(DateUtils.getNowDate());
+        return handheldTerminalMapper.insertHandheldTerminal(handheldTerminal);
+    }
+
+    /**
+     * 修改扫码扣料日志
+     * 
+     * @param handheldTerminal 扫码扣料日志
+     * @return 结果
+     */
+    @Override
+    public int updateHandheldTerminal(HandheldTerminal handheldTerminal)
+    {
+        handheldTerminal.setUpdateTime(DateUtils.getNowDate());
+        return handheldTerminalMapper.updateHandheldTerminal(handheldTerminal);
+    }
+
+    /**
+     * 批量删除扫码扣料日志
+     * 
+     * @param ids 需要删除的扫码扣料日志主键
+     * @return 结果
+     */
+    @Override
+    public int deleteHandheldTerminalByIds(Long[] ids)
+    {
+        return handheldTerminalMapper.deleteHandheldTerminalByIds(ids);
+    }
+
+    /**
+     * 删除扫码扣料日志信息
+     * 
+     * @param id 扫码扣料日志主键
+     * @return 结果
+     */
+    @Override
+    public int deleteHandheldTerminalById(Long id)
+    {
+        return handheldTerminalMapper.deleteHandheldTerminalById(id);
+    }
+}

+ 98 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/impl/MaterialRetentionLogServiceImpl.java

@@ -0,0 +1,98 @@
+package com.zkqy.amichi.service.impl;
+
+import java.util.List;
+
+import com.zkqy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.zkqy.amichi.mapper.MaterialRetentionLogMapper;
+import com.zkqy.amichi.domain.MaterialRetentionLog;
+import com.zkqy.amichi.service.IMaterialRetentionLogService;
+
+/**
+ * 扫码扣料日志Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2024-11-13
+ */
+@Service
+public class MaterialRetentionLogServiceImpl implements IMaterialRetentionLogService 
+{
+    @Autowired
+    private MaterialRetentionLogMapper materialRetentionLogMapper;
+
+    /**
+     * 查询扫码扣料日志
+     * 
+     * @param id 扫码扣料日志主键
+     * @return 扫码扣料日志
+     */
+    @Override
+    public MaterialRetentionLog selectMaterialRetentionLogById(Long id)
+    {
+        return materialRetentionLogMapper.selectMaterialRetentionLogById(id);
+    }
+
+    /**
+     * 查询扫码扣料日志列表
+     * 
+     * @param materialRetentionLog 扫码扣料日志
+     * @return 扫码扣料日志
+     */
+    @Override
+    public List<MaterialRetentionLog> selectMaterialRetentionLogList(MaterialRetentionLog materialRetentionLog)
+    {
+        return materialRetentionLogMapper.selectMaterialRetentionLogList(materialRetentionLog);
+    }
+
+    /**
+     * 新增扫码扣料日志
+     * 
+     * @param materialRetentionLog 扫码扣料日志
+     * @return 结果
+     */
+    @Override
+    public int insertMaterialRetentionLog(MaterialRetentionLog materialRetentionLog)
+    {
+        materialRetentionLog.setCreateTime(DateUtils.getNowDate());
+        return materialRetentionLogMapper.insertMaterialRetentionLog(materialRetentionLog);
+    }
+
+    /**
+     * 修改扫码扣料日志
+     * 
+     * @param materialRetentionLog 扫码扣料日志
+     * @return 结果
+     */
+    @Override
+    public int updateMaterialRetentionLog(MaterialRetentionLog materialRetentionLog)
+    {
+        materialRetentionLog.setUpdateTime(DateUtils.getNowDate());
+        return materialRetentionLogMapper.updateMaterialRetentionLog(materialRetentionLog);
+    }
+
+    /**
+     * 批量删除扫码扣料日志
+     * 
+     * @param ids 需要删除的扫码扣料日志主键
+     * @return 结果
+     */
+    @Override
+    public int deleteMaterialRetentionLogByIds(Long[] ids)
+    {
+        return materialRetentionLogMapper.deleteMaterialRetentionLogByIds(ids);
+    }
+
+    /**
+     * 删除扫码扣料日志信息
+     * 
+     * @param id 扫码扣料日志主键
+     * @return 结果
+     */
+    @Override
+    public int deleteMaterialRetentionLogById(Long id)
+    {
+        return materialRetentionLogMapper.deleteMaterialRetentionLogById(id);
+    }
+
+}

+ 97 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/impl/ProcedureListServiceImpl.java

@@ -0,0 +1,97 @@
+package com.zkqy.amichi.service.impl;
+
+import java.util.List;
+
+import com.zkqy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.zkqy.amichi.mapper.ProcedureListMapper;
+import com.zkqy.amichi.domain.ProcedureList;
+import com.zkqy.amichi.service.IProcedureListService;
+
+/**
+ * 工序列表Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2024-11-14
+ */
+@Service
+public class ProcedureListServiceImpl implements IProcedureListService 
+{
+    @Autowired
+    private ProcedureListMapper procedureListMapper;
+
+    /**
+     * 查询工序列表
+     * 
+     * @param id 工序列表主键
+     * @return 工序列表
+     */
+    @Override
+    public ProcedureList selectProcedureListById(Long id)
+    {
+        return procedureListMapper.selectProcedureListById(id);
+    }
+
+    /**
+     * 查询工序列表列表
+     * 
+     * @param procedureList 工序列表
+     * @return 工序列表
+     */
+    @Override
+    public List<ProcedureList> selectProcedureListList(ProcedureList procedureList)
+    {
+        return procedureListMapper.selectProcedureListList(procedureList);
+    }
+
+    /**
+     * 新增工序列表
+     * 
+     * @param procedureList 工序列表
+     * @return 结果
+     */
+    @Override
+    public int insertProcedureList(ProcedureList procedureList)
+    {
+        procedureList.setCreateTime(DateUtils.getNowDate());
+        return procedureListMapper.insertProcedureList(procedureList);
+    }
+
+    /**
+     * 修改工序列表
+     * 
+     * @param procedureList 工序列表
+     * @return 结果
+     */
+    @Override
+    public int updateProcedureList(ProcedureList procedureList)
+    {
+        procedureList.setUpdateTime(DateUtils.getNowDate());
+        return procedureListMapper.updateProcedureList(procedureList);
+    }
+
+    /**
+     * 批量删除工序列表
+     * 
+     * @param ids 需要删除的工序列表主键
+     * @return 结果
+     */
+    @Override
+    public int deleteProcedureListByIds(Long[] ids)
+    {
+        return procedureListMapper.deleteProcedureListByIds(ids);
+    }
+
+    /**
+     * 删除工序列表信息
+     * 
+     * @param id 工序列表主键
+     * @return 结果
+     */
+    @Override
+    public int deleteProcedureListById(Long id)
+    {
+        return procedureListMapper.deleteProcedureListById(id);
+    }
+}

+ 93 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/impl/RingScanInformationFirstServiceImpl.java

@@ -0,0 +1,93 @@
+package com.zkqy.amichi.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.zkqy.amichi.mapper.RingScanInformationFirstMapper;
+import com.zkqy.amichi.domain.RingScanInformationFirst;
+import com.zkqy.amichi.service.IRingScanInformationFirstService;
+
+/**
+ * 第一次扫描信息记录Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2024-11-15
+ */
+@Service
+public class RingScanInformationFirstServiceImpl implements IRingScanInformationFirstService 
+{
+    @Autowired
+    private RingScanInformationFirstMapper ringScanInformationFirstMapper;
+
+    /**
+     * 查询第一次扫描信息记录
+     * 
+     * @param id 第一次扫描信息记录主键
+     * @return 第一次扫描信息记录
+     */
+    @Override
+    public RingScanInformationFirst selectRingScanInformationFirstById(Long id)
+    {
+        return ringScanInformationFirstMapper.selectRingScanInformationFirstById(id);
+    }
+
+    /**
+     * 查询第一次扫描信息记录列表
+     * 
+     * @param ringScanInformationFirst 第一次扫描信息记录
+     * @return 第一次扫描信息记录
+     */
+    @Override
+    public List<RingScanInformationFirst> selectRingScanInformationFirstList(RingScanInformationFirst ringScanInformationFirst)
+    {
+        return ringScanInformationFirstMapper.selectRingScanInformationFirstList(ringScanInformationFirst);
+    }
+
+    /**
+     * 新增第一次扫描信息记录
+     * 
+     * @param ringScanInformationFirst 第一次扫描信息记录
+     * @return 结果
+     */
+    @Override
+    public int insertRingScanInformationFirst(RingScanInformationFirst ringScanInformationFirst)
+    {
+        return ringScanInformationFirstMapper.insertRingScanInformationFirst(ringScanInformationFirst);
+    }
+
+    /**
+     * 修改第一次扫描信息记录
+     * 
+     * @param ringScanInformationFirst 第一次扫描信息记录
+     * @return 结果
+     */
+    @Override
+    public int updateRingScanInformationFirst(RingScanInformationFirst ringScanInformationFirst)
+    {
+        return ringScanInformationFirstMapper.updateRingScanInformationFirst(ringScanInformationFirst);
+    }
+
+    /**
+     * 批量删除第一次扫描信息记录
+     * 
+     * @param ids 需要删除的第一次扫描信息记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteRingScanInformationFirstByIds(Long[] ids)
+    {
+        return ringScanInformationFirstMapper.deleteRingScanInformationFirstByIds(ids);
+    }
+
+    /**
+     * 删除第一次扫描信息记录信息
+     * 
+     * @param id 第一次扫描信息记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteRingScanInformationFirstById(Long id)
+    {
+        return ringScanInformationFirstMapper.deleteRingScanInformationFirstById(id);
+    }
+}

+ 19 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/impl/RingScanInformationServiceImpl.java

@@ -1,8 +1,13 @@
 package com.zkqy.amichi.service.impl;
 
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
+import com.zkqy.amichi.domain.RingScanInformationFirst;
+import com.zkqy.amichi.domain.vo.RingScanInformationLogVo;
 import com.zkqy.amichi.domain.vo.RingScanInformationVo;
+import com.zkqy.amichi.mapper.RingScanInformationFirstMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.zkqy.amichi.mapper.RingScanInformationMapper;
@@ -20,6 +25,8 @@ public class RingScanInformationServiceImpl implements IRingScanInformationServi
 {
     @Autowired
     private RingScanInformationMapper ringScanInformationMapper;
+    @Autowired
+    private RingScanInformationFirstMapper ringScanInformationFirstMapper;
 
     /**
      * 查询指环王扫描日志信息
@@ -33,6 +40,18 @@ public class RingScanInformationServiceImpl implements IRingScanInformationServi
         return ringScanInformationMapper.selectRingScanInformationById(id);
     }
 
+    @Override
+    public Map<String,List<RingScanInformationLogVo>> SelectRingScanInformationLog(List<String> orderNumberListString)
+    {
+        //取真实展示数据
+        List<RingScanInformationLogVo> ringScanInformations = ringScanInformationMapper.SelectRingScanInformationLog(orderNumberListString);
+        //转换为map集合
+        Map<String, List<RingScanInformationLogVo>> mapByOrderNumber = ringScanInformations.parallelStream()
+                .collect(Collectors.groupingBy(RingScanInformationLogVo::getOrderNumber));
+        return mapByOrderNumber;
+    }
+    
+    
     /**
      * 查询指环王扫描日志信息列表
      * 

+ 110 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/impl/RingTerminalServiceImpl.java

@@ -0,0 +1,110 @@
+package com.zkqy.amichi.service.impl;
+
+import java.util.List;
+
+import com.zkqy.amichi.utils.MaUtils;
+import com.zkqy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.zkqy.amichi.mapper.RingTerminalMapper;
+import com.zkqy.amichi.domain.RingTerminal;
+import com.zkqy.amichi.service.IRingTerminalService;
+
+/**
+ * 指环终端Service业务层处理
+ * 
+ * @author zkqy
+ * @date 2024-11-14
+ */
+@Service
+public class RingTerminalServiceImpl implements IRingTerminalService 
+{
+    @Autowired
+    private RingTerminalMapper ringTerminalMapper;
+
+    /**
+     * 查询指环终端
+     * 
+     * @param id 指环终端主键
+     * @return 指环终端
+     */
+    @Override
+    public RingTerminal selectRingTerminalById(Long id)
+    {
+        return ringTerminalMapper.selectRingTerminalById(id);
+    }
+
+    /**
+     * 查询指环终端列表
+     * 
+     * @param ringTerminal 指环终端
+     * @return 指环终端
+     */
+    @Override
+    public List<RingTerminal> selectRingTerminalList(RingTerminal ringTerminal)
+    {
+        return ringTerminalMapper.selectRingTerminalList(ringTerminal);
+    }
+
+    /**
+     * 新增指环终端
+     * 
+     * @param ringTerminal 指环终端
+     * @return 结果
+     */
+    @Override
+    public int insertRingTerminal(RingTerminal ringTerminal)
+    {
+        ringTerminal.setCreateTime(DateUtils.getNowDate());
+        return ringTerminalMapper.insertRingTerminal(ringTerminal);
+    }
+
+    /**
+     * 修改指环终端
+     * 
+     * @param ringTerminal 指环终端
+     * @return 结果
+     */
+    @Override
+    public int updateRingTerminal(RingTerminal ringTerminal)
+    {
+        ringTerminal.setUpdateTime(DateUtils.getNowDate());
+        return ringTerminalMapper.updateRingTerminal(ringTerminal);
+    }
+
+    /**
+     * 批量删除指环终端
+     * 
+     * @param ids 需要删除的指环终端主键
+     * @return 结果
+     */
+    @Override
+    public int deleteRingTerminalByIds(Long[] ids)
+    {
+        return ringTerminalMapper.deleteRingTerminalByIds(ids);
+    }
+
+    /**
+     * 删除指环终端信息
+     * 
+     * @param id 指环终端主键
+     * @return 结果
+     */
+    @Override
+    public int deleteRingTerminalById(Long id)
+    {
+        return ringTerminalMapper.deleteRingTerminalById(id);
+    }
+
+    /**
+     * 生成一个绑定二维码
+     * @return
+     */
+    @Override
+    public String getQrCodeToRing() {
+        String addRing = MaUtils.generateQRCodeConfig("addRing", 400, 400);
+        StringBuilder prefixString=new StringBuilder("data:image/png;base64,");
+        prefixString.append(addRing);
+        return prefixString.toString();
+    }
+}

+ 184 - 32
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/impl/StationInformationServiceImpl.java

@@ -2,16 +2,25 @@ package com.zkqy.amichi.service.impl;
 
 import java.time.Duration;
 import java.time.LocalDateTime;
+import java.util.Base64;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 import cn.hutool.core.date.DateTime;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.kingdee.bos.webapi.sdk.K3CloudApi;
 import com.zkqy.amichi.domain.*;
 import com.zkqy.amichi.domain.vo.StationProductScanningRingVo;
+import com.zkqy.amichi.jd.domain.JdMaterialInfoVo;
+import com.zkqy.amichi.jd.domain.JdProductionOrder;
+import com.zkqy.amichi.jd.domain.MaterialRetentionLogVo;
 import com.zkqy.amichi.mapper.*;
 import com.zkqy.amichi.utils.WarehouseEntryNumberGenerator;
 import com.zkqy.common.utils.DateUtils;
+import com.zkqy.common.utils.StringUtils;
 import com.zkqy.execution.produce.dispersed.entity.BpmExecuteNodeLog;
 import com.zkqy.execution.produce.dispersed.entity.BpmExecuteProcess;
 import com.zkqy.execution.produce.dispersed.mapper.BpmExecuteNodeLogMapper;
@@ -57,6 +66,15 @@ public class StationInformationServiceImpl implements IStationInformationService
     @Autowired
     private RingScanInformationMapper ringScanInformationMapper;
 
+    @Autowired
+    private  TerminalInformationMapper terminalInformationMapper;
+
+    @Autowired
+    private  MaterialRetentionLogMapper materialRetentionLogMapper;
+
+    @Autowired
+    private  RingScanInformationFirstMapper ringScanInformationFirstMapper;
+
     public static void main(String[] args) {
        String aaa="scan@&GWM-001&SMSB001";
         boolean contains = aaa.contains("scan@");
@@ -344,7 +362,82 @@ public class StationInformationServiceImpl implements IStationInformationService
         }
     }
 
-
+   @Override
+   public  String   sweepingMaterial(String productNumber,String gxm){
+       //输入产品编号查询,
+       MaterialRetentionLog materialRetentionLog=new MaterialRetentionLog();
+       materialRetentionLog.setFlowSequenceNumber(productNumber);
+       materialRetentionLog.setProcess(gxm);
+       List<MaterialRetentionLog> materialRetentionLogs = materialRetentionLogMapper.selectMaterialRetentionLogList(materialRetentionLog);
+       if(materialRetentionLogs.size()>0){
+           return "此料已扣除";
+       }
+       //查询条件
+       String queryString ="{\n" +
+               "    \"FormId\": \"PRD_MO\",\n" +
+               "    \"FieldKeys\": \"FBillNo\",\n" +
+               "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FSerialNo\",\"Compare\":\"67\",\"Value\":\""+productNumber+"\",\"Right\":\"\",\"Logic\":0}],\n" +
+               "    \"OrderString\": \"\",\n" +
+               "    \"TopRowCount\": 0,\n" +
+               "    \"StartRow\": 0,\n" +
+               "    \"Limit\": 2000,\n" +
+               "    \"SubSystemId\": \"\"\n" +
+               "}";
+       //查询条件
+       Map<String, Object> map = JSON.parseObject(queryString, Map.class);
+       K3CloudApi api = new K3CloudApi();
+       List<JdProductionOrder> jdProductionOrders;
+       try {
+           String resultJson = api.billQuery(JSON.toJSONString(map));
+           //如果查询的数据为空
+           if(resultJson==""||resultJson=="[]"){
+               return "不能添加这次扫描记录";
+           }else{
+               //转换实体类对象
+               jdProductionOrders = JSON.parseArray(resultJson, JdProductionOrder.class);
+               //按照流转卡把信息查询出来了
+               if(jdProductionOrders.size()>0) {
+                   //单据编号
+                   String documentNumber = jdProductionOrders.get(0).getDocumentNumber();
+                   //这个生产订单生产的数量
+                   //String quantity = jdProductionOrders.get(0).getQuantity();
+                   //根据生产订单号查询生产用料清单
+                   String productionMaterialsListQuery="{\n" +
+                           "    \"FormId\": \"PRD_PPBOM\",\n" +
+                           "    \"FieldKeys\": \"FMaterialID.FNumber,FMaterialName,FMaterialModel,FMaterialModel2,FDescription,FMaterialID2.FNumber,FMaterialName1,FMaterialModel1,FUnitID2.FName,FMustQty,FMEMO1,FNumerator,FMaterialType\",\n" +
+                           "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FMOBillNO\",\"Compare\":\"17\",\"Value\":\""+documentNumber+"\",\"Right\":\"\",\"Logic\":0},{\"Left\":\"\",\"FieldName\":\"FProcessID.FName\",\"Compare\":\"17\",\"Value\":\""+gxm+"\",\"Right\":\"\",\"Logic\":0}],\n" +
+                           "    \"OrderString\": \"\",\n" +
+                           "    \"TopRowCount\": 0,\n" +
+                           "    \"StartRow\": 0,\n" +
+                           "    \"Limit\": 2000,\n" +
+                           "    \"SubSystemId\": \"\"\n" +
+                           "}";
+                   //查询生产用料清单
+                   Map<String, Object> map2 = JSON.parseObject(productionMaterialsListQuery, Map.class);
+                   //生产用料清单结果
+                   String resultJsonJG = api.billQuery(JSON.toJSONString(map2));
+                   //json转Java实体类对象
+                   List<MaterialRetentionLogVo> materialRetentionLogVos = JSON.parseArray(resultJsonJG, MaterialRetentionLogVo.class);
+                   //赋值一些默认值
+                   List<MaterialRetentionLogVo> collect = materialRetentionLogVos.parallelStream().map(item -> {
+                       item.setCkNumber("CK005");
+                       item.setDeliveryWarehouse("车间仓");
+                       item.setFlowSequenceNumber(productNumber);//流转序列号
+                       item.setProcess(gxm);
+                       return item;
+                   }).collect(Collectors.toList());
+                   //分子数量基本的扣料单位
+                   int i = materialRetentionLogMapper.insertMaterialRetentionLogBatch(collect);
+                   if(i>0){
+                       return "扣料成功";
+                   }
+               }
+           }
+       } catch (Exception e) {
+           throw new RuntimeException(e);
+       }
+       return "茂昌";
+   };
     /**
      * 指环王扫描信息hmc
      * @param stationProductScanningRingVo
@@ -359,28 +452,30 @@ public class StationInformationServiceImpl implements IStationInformationService
 //            return "请扫描相关二维码";
 //        };
         try {
+//            String string = Base64.getDecoder().decode(stationProductScanningRingVo.getDeviceNumber()).toString();
             String deviceNumberAndName = stationProductScanningRingVo.getDeviceNumber();//设备号
             String[] split = deviceNumberAndName.split("-");
             String deviceNumber=split[0];
             String deviceName=split[1];
+
             String scanningTime = stationProductScanningRingVo.getScanningTime();//扫描时间
            //先获取到当前设备上次的扫描时间
-            RingScanInformation ringScanInformationQuery=new RingScanInformation();
-            ringScanInformationQuery.setDeviceName(deviceName);
-            RingScanInformation ringScanInformations = ringScanInformationMapper.selectRingScanInformationListDateTimeMax(ringScanInformationQuery);
-            if(ringScanInformations!=null){
-                //拿到上次扫描的时间
-                LocalDateTime scanningTime1 = ringScanInformations.getScanningTime();
-                //拿到当前系统时间
-                LocalDateTime now = LocalDateTime.now();
-                //计算两次时间的时间差
-                Duration duration = Duration.between(scanningTime1, now);
-                boolean isTwoMinutesPassed = duration.toMinutes() < 2;
-                //判断两次时间是否大于
-                if (isTwoMinutesPassed) {
-                  return "同一设备,两分钟之内不能重复扫描";
-                }
-            }
+//            RingScanInformation ringScanInformationQuery=new RingScanInformation();
+//            ringScanInformationQuery.setDeviceName(deviceName);
+//            RingScanInformation ringScanInformations = ringScanInformationMapper.selectRingScanInformationListDateTimeMax(ringScanInformationQuery);
+////            if(ringScanInformations!=null){
+//                //拿到上次扫描的时间
+//                LocalDateTime scanningTime1 = ringScanInformations.getScanningTime();
+//                //拿到当前系统时间
+//                LocalDateTime now = LocalDateTime.now();
+//                //计算两次时间的时间差
+//                Duration duration = Duration.between(scanningTime1, now);
+//                boolean isTwoMinutesPassed = duration.toMinutes() < 1;
+//                //判断两次时间是否大于
+//                if (isTwoMinutesPassed) {
+//                  return "同一设备,两分钟之内不能重复扫描";
+//                }
+//            }
             String contentInformation = stationProductScanningRingVo.getContentInformation();//扫描内容
             RingScanInformation ringScanInformation=new RingScanInformation();
             ringScanInformation.setContentInformation(contentInformation);
@@ -388,6 +483,16 @@ public class StationInformationServiceImpl implements IStationInformationService
             ringScanInformation.setScanningTime(localDateTime);
             ringScanInformation.setDeviceName(deviceName);
             ringScanInformation.setDeviceNumber(deviceNumber);
+            //赋值当前扫描人
+            TerminalInformation terminalInformation=new TerminalInformation();
+            terminalInformation.setStationName(deviceNumber);
+            List<TerminalInformation> terminalInformations = terminalInformationMapper.selectTerminalInformationList(terminalInformation);
+            if(terminalInformations.size()>0){
+                ringScanInformation.setPersonnelName(terminalInformations.get(0).getPersonnelName());
+                ringScanInformation.setProcess(terminalInformations.get(0).getProcess());
+                ringScanInformation.setProcessName(terminalInformations.get(0).getProcessName());
+            }
+
             String nativeNumber="";
             if(contentInformation.contains("Z")){
                 nativeNumber = contentInformation.replace("Z", "");
@@ -395,27 +500,74 @@ public class StationInformationServiceImpl implements IStationInformationService
             if(contentInformation.contains("D")){
                 nativeNumber=contentInformation.replace("D","");
             }
-            ringScanInformation.setNativeNumbering(nativeNumber);
+            if(StringUtils.isNotNull(nativeNumber)&&nativeNumber!=""){
+                //取值真实的扫描内容
+                ringScanInformation.setNativeNumbering(nativeNumber);
+            }else {
+                //扫描内容
+                ringScanInformation.setNativeNumbering(contentInformation);
+            }
+            //根据扫描内容拿到生产订单号和订单号
+            String  queryStringOrderNumberAndProductionOrderNumber="{\n" +
+                    "    \"FormId\": \"PRD_MO\",\n" +
+                    "    \"FieldKeys\": \"FSaleOrderNo,FBillNo\",\n" +
+                    "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FSerialNo\",\"Compare\":\"17\",\"Value\":\""+ringScanInformation.getNativeNumbering()+"\",\"Right\":\"\",\"Logic\":0}],\n" +
+                    "    \"OrderString\": \"\",\n" +
+                    "    \"TopRowCount\": 0,\n" +
+                    "    \"StartRow\": 0,\n" +
+                    "    \"Limit\": 2000,\n" +
+                    "    \"SubSystemId\": \"\"\n" +
+                    "}";
+            Map<String, Object> map = JSON.parseObject(queryStringOrderNumberAndProductionOrderNumber, Map.class);
+            K3CloudApi api = new K3CloudApi();
+            String resultJson = api.billQuery(JSON.toJSONString(map));
+            //判断内不为空
+            if(resultJson!=""&resultJson!="[]"){
+                List<JdProductionOrder>    jdProductionOrders = JSON.parseArray(resultJson, JdProductionOrder.class);
+                if(jdProductionOrders.size()>0){
+                    //需求单据号
+                    ringScanInformation.setOrderNumber(jdProductionOrders.get(0).getDemandDocument());
+                    //生产订单号
+                    ringScanInformation.setProductionOrderNumber(jdProductionOrders.get(0).getDocumentNumber());
+                }
+            }
+            if(StringUtils.isNotNull(ringScanInformation.getOrderNumber())){
+                //--记录第一扫描(将来第一扫描的单据记录)
+                RingScanInformationFirst ringScanInformationFirst=new RingScanInformationFirst();
+                ringScanInformationFirst.setOrderNumber(ringScanInformation.getOrderNumber());
+                List<RingScanInformationFirst> ringScanInformationFirsts = ringScanInformationFirstMapper.selectRingScanInformationFirstList(ringScanInformationFirst);
+                if(ringScanInformationFirsts.size()<=0){
+                    ringScanInformationFirst.setProductionOrderNumber(ringScanInformation.getProductionOrderNumber());
+                    ringScanInformationFirst.setStatus("1");
+                    ringScanInformationFirst.setStartTime(LocalDateTime.now());//开始时间
+                    //查询这个订单的总数量是多少
+                    String sa="{\n" +
+                            "    \"FormId\": \"SAL_SaleOrder\",\n" +
+                            "    \"FieldKeys\": \"FBillNo,FQty\",\n" +
+                            "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FBillNo\",\"Compare\":\"17\",\"Value\":\""+ringScanInformation.getOrderNumber()+"+\",\"Right\":\"\",\"Logic\":0}],\n" +
+                            "    \"OrderString\": \"\",\n" +
+                            "    \"TopRowCount\": 0,\n" +
+                            "    \"StartRow\": 0,\n" +
+                            "    \"Limit\": 2000,\n" +
+                            "    \"SubSystemId\": \"\"\n" +
+                            "}";
+                    Map<String, Object> mapTotal = JSON.parseObject(sa, Map.class);
+                    String resultJsonTotal = api.billQuery(JSON.toJSONString(mapTotal));
+                    List<Map> mapListTotal = JSON.parseArray(resultJsonTotal, Map.class);
+                    Double totalAmount = mapListTotal.stream()
+                            .filter(map1 -> map1.containsKey("FQty")) // 确保 map 中包含 "amount" 字段
+                            .mapToDouble(map1 -> ((Number) map1.get("FQty")).doubleValue()) // 将 "amount" 字段转换为 double
+                            .sum(); // 求和
+                    ringScanInformationFirst.setTotalQuantity(String.valueOf(totalAmount.intValue()));
+                    int i = ringScanInformationFirstMapper.insertRingScanInformationFirst(ringScanInformationFirst);
+                }
+            }
             int i2 = ringScanInformationMapper.insertRingScanInformation(ringScanInformation);
             if(i2>0){
                 return "扫描成功";
             }else {
                 return "扫描失败";
             }
-//            if(i2>0){
-//                //根据序列号id
-//                ProductionCardFlow productionCardFlow=new ProductionCardFlow();
-//                productionCardFlow.setDemandDocumentNumber(nativeNumber);
-//                List<ProductionCardFlow> productionCardFlows = productionCardFlowMapper.selectProductionCardFlowList(productionCardFlow);
-//                if(productionCardFlows.size()>0){
-//
-//                }else {
-//                    return "未有当前生产任务";
-//                }
-//                return "扫描成功";
-//            }else {
-//                return "扫描失败";
-//            }
         } catch (Exception e) {
             throw new RuntimeException(e);
         }

+ 23 - 1
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/utils/MaUtils.java

@@ -23,7 +23,29 @@ public class MaUtils {
         hints.put(EncodeHintType.MARGIN, margin); // 设置边距
         try {
             // 生成二维码的位矩阵
-            BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, 120, 120,hints);
+            BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, 100, 100,hints);
+            // 将BitMatrix转为BufferedImage
+            BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            // 将图片写入输出流
+            ImageIO.write(image, "png", baos);
+            byte[] imageBytes = baos.toByteArray();
+            // 进行Base64编码
+            return Base64.getEncoder().encodeToString(imageBytes);
+        } catch (WriterException | IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    public static String generateQRCodeConfig(String text,Integer width,Integer height) {
+        QRCodeWriter qrCodeWriter = new QRCodeWriter();
+        Map<EncodeHintType, Integer> hints = new HashMap<>();
+        int margin = 0; // 设置边距
+        hints.put(EncodeHintType.MARGIN, margin); // 设置边距
+        try {
+            // 生成二维码的位矩阵
+            BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height,hints);
             // 将BitMatrix转为BufferedImage
             BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
             ByteArrayOutputStream baos = new ByteArrayOutputStream();

+ 96 - 0
zkqy-fujian-amichi/src/main/resources/mapper/HandheldTerminalMapper.xml

@@ -0,0 +1,96 @@
+<?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.zkqy.amichi.mapper.HandheldTerminalMapper">
+    
+    <resultMap type="com.zkqy.amichi.domain.HandheldTerminal" id="HandheldTerminalResult">
+        <result property="id"    column="id"    />
+        <result property="handheldTerminalNumber"    column="handheld_terminal_number"    />
+        <result property="handheldTerminalName"    column="handheld_terminal_name"    />
+        <result property="remarks"    column="remarks"    />
+        <result property="createById"    column="create_by_id"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateById"    column="update_by_id"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="delFlag"    column="del_flag"    />
+    </resultMap>
+
+    <sql id="selectHandheldTerminalVo">
+        select id, handheld_terminal_number, handheld_terminal_name, remarks, create_by_id, create_by, create_time, update_by_id, update_by, update_time, del_flag from fjqydb.handheld_terminal
+    </sql>
+
+    <select id="selectHandheldTerminalList" parameterType="com.zkqy.amichi.domain.HandheldTerminal" resultMap="HandheldTerminalResult">
+        <include refid="selectHandheldTerminalVo"/>
+        <where>
+            <if test="handheldTerminalNumber != null  and handheldTerminalNumber != ''"> and handheld_terminal_number = #{handheldTerminalNumber}</if>
+            <if test="handheldTerminalName != null  and handheldTerminalName != ''"> and handheld_terminal_name like concat('%', #{handheldTerminalName}, '%')</if>
+            <if test="remarks != null  and remarks != ''"> and remarks = #{remarks}</if>
+            <if test="createById != null "> and create_by_id = #{createById}</if>
+            <if test="updateById != null "> and update_by_id = #{updateById}</if>
+        </where>
+    </select>
+
+    <select id="selectHandheldTerminalById" parameterType="Long" resultMap="HandheldTerminalResult">
+        <include refid="selectHandheldTerminalVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertHandheldTerminal" parameterType="com.zkqy.amichi.domain.HandheldTerminal" useGeneratedKeys="true" keyProperty="id">
+        insert into fjqydb.handheld_terminal
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="handheldTerminalNumber != null and handheldTerminalNumber != ''">handheld_terminal_number,</if>
+            <if test="handheldTerminalName != null and handheldTerminalName != ''">handheld_terminal_name,</if>
+            <if test="remarks != null">remarks,</if>
+            <if test="createById != null">create_by_id,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateById != null">update_by_id,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="delFlag != null">del_flag,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="handheldTerminalNumber != null and handheldTerminalNumber != ''">#{handheldTerminalNumber},</if>
+            <if test="handheldTerminalName != null and handheldTerminalName != ''">#{handheldTerminalName},</if>
+            <if test="remarks != null">#{remarks},</if>
+            <if test="createById != null">#{createById},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateById != null">#{updateById},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+         </trim>
+    </insert>
+
+    <update id="updateHandheldTerminal" parameterType="com.zkqy.amichi.domain.HandheldTerminal">
+        update fjqydb.handheld_terminal
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="handheldTerminalNumber != null and handheldTerminalNumber != ''">handheld_terminal_number = #{handheldTerminalNumber},</if>
+            <if test="handheldTerminalName != null and handheldTerminalName != ''">handheld_terminal_name = #{handheldTerminalName},</if>
+            <if test="remarks != null">remarks = #{remarks},</if>
+            <if test="createById != null">create_by_id = #{createById},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateById != null">update_by_id = #{updateById},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteHandheldTerminalById" parameterType="Long">
+        delete from fjqydb.handheld_terminal where id = #{id}
+    </delete>
+
+    <delete id="deleteHandheldTerminalByIds" parameterType="String">
+        delete from fjqydb.handheld_terminal where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 296 - 0
zkqy-fujian-amichi/src/main/resources/mapper/MaterialRetentionLogMapper.xml

@@ -0,0 +1,296 @@
+<?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.zkqy.amichi.mapper.MaterialRetentionLogMapper">
+    <resultMap type="com.zkqy.amichi.domain.MaterialRetentionLog" id="MaterialRetentionLogResult">
+        <result property="id"    column="id"    />
+        <result property="materialCode"    column="material_code"    />
+        <result property="materialName"    column="material_name"    />
+        <result property="specification"    column="specification"    />
+        <result property="model"    column="model"    />
+        <result property="unit"    column="unit"    />
+        <result property="actualQuantityIssued"    column="actual_quantity_issued"    />
+        <result property="deliveryWarehouse"    column="delivery_warehouse"    />
+        <result property="ckNumber"    column="ck_number"    />
+        <result property="documentRemarks"    column="document_remarks"    />
+        <result property="documentType"    column="document_type"    />
+        <result property="inventoryOrganization"    column="inventory_organization"    />
+        <result property="receivingTissue"    column="receiving_tissue"    />
+        <result property="inventoryDirection"    column="inventory_direction"    />
+        <result property="dateOfDelivery"    column="date_of_delivery"    />
+        <result property="materialsRequisitionDepartment"    column="materials_requisition_department"    />
+        <result property="materialTaker"    column="material_taker"    />
+        <result property="businessType"    column="business_type"    />
+        <result property="ownerType"    column="owner_type"    />
+        <result property="owner"    column="owner"    />
+        <result property="documentStatus"    column="document_status"    />
+        <result property="detailedRemarks"    column="detailed_remarks"    />
+        <result property="createById"    column="create_by_id"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateById"    column="update_by_id"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="productCode"    column="product_code"    />
+        <result property="productName"    column="product_name"    />
+        <result property="productModel"    column="product_model"    />
+        <result property="productSpecification"    column="product_specification"    />
+        <result property="materialType"    column="material_type"    />
+        <result property="process"    column="process"    />
+    </resultMap>
+
+    <sql id="selectMaterialRetentionLogVo">
+        select id, material_code, material_name, specification, model, unit,
+               CASE
+                  WHEN CAST(actual_quantity_issued AS CHAR) LIKE '%.0000' THEN FLOOR(actual_quantity_issued)
+                  ELSE actual_quantity_issued
+            END AS actual_quantity_issued,delivery_warehouse, ck_number, document_remarks,
+        document_type, inventory_organization, receiving_tissue, inventory_direction, date_of_delivery, materials_requisition_department,
+        material_taker, business_type, owner_type, owner, document_status, detailed_remarks, create_by_id, create_by, create_time,
+        update_by_id, update_by, update_time, del_flag,product_code,product_name,product_model,product_specification,material_type,process from fjqydb.material_retention_log
+    </sql>
+
+    <select id="selectMaterialRetentionLogList" parameterType="com.zkqy.amichi.domain.MaterialRetentionLog" resultMap="MaterialRetentionLogResult">
+        <include refid="selectMaterialRetentionLogVo"/>
+        <where>  
+            <if test="materialCode != null  and materialCode != ''"> and material_code = #{materialCode}</if>
+            <if test="materialName != null  and materialName != ''"> and material_name like concat('%', #{materialName}, '%')</if>
+            <if test="specification != null  and specification != ''"> and specification = #{specification}</if>
+            <if test="model != null  and model != ''"> and model = #{model}</if>
+            <if test="unit != null  and unit != ''"> and unit = #{unit}</if>
+            <if test="actualQuantityIssued != null  and actualQuantityIssued != ''"> and actual_quantity_issued = #{actualQuantityIssued}</if>
+            <if test="deliveryWarehouse != null  and deliveryWarehouse != ''"> and delivery_warehouse = #{deliveryWarehouse}</if>
+            <if test="ckNumber != null  and ckNumber != ''"> and ck_number = #{ckNumber}</if>
+            <if test="documentRemarks != null  and documentRemarks != ''"> and document_remarks = #{documentRemarks}</if>
+            <if test="documentType != null  and documentType != ''"> and document_type = #{documentType}</if>
+            <if test="inventoryOrganization != null  and inventoryOrganization != ''"> and inventory_organization = #{inventoryOrganization}</if>
+            <if test="receivingTissue != null  and receivingTissue != ''"> and receiving_tissue = #{receivingTissue}</if>
+            <if test="inventoryDirection != null  and inventoryDirection != ''"> and inventory_direction = #{inventoryDirection}</if>
+            <if test="dateOfDelivery != null  and dateOfDelivery != ''"> and date_of_delivery = #{dateOfDelivery}</if>
+            <if test="materialsRequisitionDepartment != null  and materialsRequisitionDepartment != ''"> and materials_requisition_department = #{materialsRequisitionDepartment}</if>
+            <if test="materialTaker != null  and materialTaker != ''"> and material_taker = #{materialTaker}</if>
+            <if test="businessType != null  and businessType != ''"> and business_type = #{businessType}</if>
+            <if test="ownerType != null  and ownerType != ''"> and owner_type = #{ownerType}</if>
+            <if test="owner != null  and owner != ''"> and owner = #{owner}</if>
+            <if test="documentStatus != null  and documentStatus != ''"> and document_status = #{documentStatus}</if>
+            <if test="detailedRemarks != null  and detailedRemarks != ''"> and detailed_remarks = #{detailedRemarks}</if>
+            <if test="createById != null "> and create_by_id = #{createById}</if>
+            <if test="updateById != null "> and update_by_id = #{updateById}</if>
+
+            <if test="productCode != null "> and product_code = #{productCode}</if>
+            <if test="productName != null "> and product_name = #{productName}</if>
+            <if test="productModel != null "> and product_model = #{productModel}</if>
+            <if test="productSpecification != null "> and product_specification = #{productSpecification}</if>
+
+        </where>
+    </select>
+    
+    <select id="selectMaterialRetentionLogById" parameterType="Long" resultMap="MaterialRetentionLogResult">
+        <include refid="selectMaterialRetentionLogVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertMaterialRetentionLog" parameterType="com.zkqy.amichi.domain.MaterialRetentionLog" useGeneratedKeys="true" keyProperty="id">
+        insert into fjqydb.material_retention_log
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="materialCode != null and materialCode != ''">material_code,</if>
+            <if test="materialName != null and materialName != ''">material_name,</if>
+            <if test="specification != null">specification,</if>
+            <if test="model != null">model,</if>
+            <if test="unit != null">unit,</if>
+            <if test="actualQuantityIssued != null">actual_quantity_issued,</if>
+            <if test="deliveryWarehouse != null">delivery_warehouse,</if>
+            <if test="ckNumber != null">ck_number,</if>
+            <if test="documentRemarks != null">document_remarks,</if>
+            <if test="documentType != null">document_type,</if>
+            <if test="inventoryOrganization != null">inventory_organization,</if>
+            <if test="receivingTissue != null">receiving_tissue,</if>
+            <if test="inventoryDirection != null">inventory_direction,</if>
+            <if test="dateOfDelivery != null">date_of_delivery,</if>
+            <if test="materialsRequisitionDepartment != null">materials_requisition_department,</if>
+            <if test="materialTaker != null">material_taker,</if>
+            <if test="businessType != null">business_type,</if>
+            <if test="ownerType != null">owner_type,</if>
+            <if test="owner != null">owner,</if>
+            <if test="documentStatus != null">document_status,</if>
+            <if test="detailedRemarks != null">detailed_remarks,</if>
+            <if test="createById != null">create_by_id,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateById != null">update_by_id,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="productCode != null ">product_code,</if>
+            <if test="productName != null ">product_name,</if>
+            <if test="prouuctModel != null ">prouuct_model,</if>
+            <if test="productSpecification != null ">product_specification</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="materialCode != null and materialCode != ''">#{materialCode},</if>
+            <if test="materialName != null and materialName != ''">#{materialName},</if>
+            <if test="specification != null">#{specification},</if>
+            <if test="model != null">#{model},</if>
+            <if test="unit != null">#{unit},</if>
+            <if test="actualQuantityIssued != null">#{actualQuantityIssued},</if>
+            <if test="deliveryWarehouse != null">#{deliveryWarehouse},</if>
+            <if test="ckNumber != null">#{ckNumber},</if>
+            <if test="documentRemarks != null">#{documentRemarks},</if>
+            <if test="documentType != null">#{documentType},</if>
+            <if test="inventoryOrganization != null">#{inventoryOrganization},</if>
+            <if test="receivingTissue != null">#{receivingTissue},</if>
+            <if test="inventoryDirection != null">#{inventoryDirection},</if>
+            <if test="dateOfDelivery != null">#{dateOfDelivery},</if>
+            <if test="materialsRequisitionDepartment != null">#{materialsRequisitionDepartment},</if>
+            <if test="materialTaker != null">#{materialTaker},</if>
+            <if test="businessType != null">#{businessType},</if>
+            <if test="ownerType != null">#{ownerType},</if>
+            <if test="owner != null">#{owner},</if>
+            <if test="documentStatus != null">#{documentStatus},</if>
+            <if test="detailedRemarks != null">#{detailedRemarks},</if>
+            <if test="createById != null">#{createById},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateById != null">#{updateById},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="productCode != null ">#{productCode},</if>
+            <if test="productName != null ">#{productName},</if>
+            <if test="prouuctModel != null ">#{prouuctModel},</if>
+            <if test="productSpecification != null ">#{productSpecification}</if>
+         </trim>
+    </insert>
+    <insert id="insertMaterialRetentionLogBatch" parameterType="com.zkqy.amichi.jd.domain.MaterialRetentionLogVo" useGeneratedKeys="true" keyProperty="id">
+        <foreach collection ="list" item="item" separator =";">
+            INSERT INTO fjqydb.material_retention_log
+            <trim prefix="(" suffix=")" suffixOverrides=",">
+                <if test="item.materialCode != null and item.materialCode != ''">material_code,</if>
+                <if test="item.materialName != null and item.materialName != ''">material_name,</if>
+                <if test="item.specification != null">specification,</if>
+                <if test="item.model != null">model,</if>
+                <if test="item.unit != null">unit,</if>
+                <if test="item.actualQuantityIssued != null">actual_quantity_issued,</if>
+                <if test="item.deliveryWarehouse != null">delivery_warehouse,</if>
+                <if test="item.ckNumber != null">ck_number,</if>
+                <if test="item.documentRemarks != null">document_remarks,</if>
+                <if test="item.documentType != null">document_type,</if>
+                <if test="item.inventoryOrganization != null">inventory_organization,</if>
+                <if test="item.receivingTissue != null">receiving_tissue,</if>
+                <if test="item.inventoryDirection != null">inventory_direction,</if>
+                <if test="item.dateOfDelivery != null">date_of_delivery,</if>
+                <if test="item.materialsRequisitionDepartment != null">materials_requisition_department,</if>
+                <if test="item.materialTaker != null">material_taker,</if>
+                <if test="item.businessType != null">business_type,</if>
+                <if test="item.ownerType != null">owner_type,</if>
+                <if test="item.owner != null">owner,</if>
+                <if test="item.documentStatus != null">document_status,</if>
+                <if test="item.detailedRemarks != null">detailed_remarks,</if>
+                <if test="item.createById != null">create_by_id,</if>
+                <if test="item.createBy!= null">create_by,</if>
+                <if test="item.createTime != null">create_time,</if>
+                <if test="item.updateById != null">update_by_id,</if>
+                <if test="item.updateBy != null">update_by,</if>
+                <if test="item.updateTime != null">update_time,</if>
+                <if test="item.delFlag != null">del_flag,</if>
+                <if test="item.productCode != null ">product_code,</if>
+                <if test="item.productName != null ">product_name,</if>
+                <if test="item.productModel != null ">product_model,</if>
+                <if test="item.productSpecification != null ">product_specification,</if>
+                <if test="item.materialType!=null">material_type,</if>
+                <if test="item.flowSequenceNumber!=null">flow_sequence_number,</if>
+                <if test="item.process!=null">process</if>
+            </trim>
+            VALUES
+            <trim prefix="(" suffix=")" suffixOverrides=",">
+                <if test="item.materialCode != null and item.materialCode != ''">#{item.materialCode},</if>
+                <if test="item.materialName != null and item.materialName != ''">#{item.materialName},</if>
+                <if test="item.specification != null">#{item.specification},</if>
+                <if test="item.model != null">#{item.model},</if>
+                <if test="item.unit != null">#{item.unit},</if>
+                <if test="item.actualQuantityIssued != null">#{item.actualQuantityIssued},</if>
+                <if test="item.deliveryWarehouse != null">#{item.deliveryWarehouse},</if>
+                <if test="item.ckNumber != null">#{item.ckNumber},</if>
+                <if test="item.documentRemarks != null">#{item.documentRemarks},</if>
+                <if test="item.documentType != null">#{item.documentType},</if>
+                <if test="item.inventoryOrganization != null">#{item.inventoryOrganization},</if>
+                <if test="item.receivingTissue != null">#{item.receivingTissue},</if>
+                <if test="item.inventoryDirection != null">#{item.inventoryDirection},</if>
+                <if test="item.dateOfDelivery != null">#{item.dateOfDelivery},</if>
+                <if test="item.materialsRequisitionDepartment != null">#{item.materialsRequisitionDepartment},</if>
+                <if test="item.materialTaker != null">#{item.materialTaker},</if>
+                <if test="item.businessType != null">#{item.businessType},</if>
+                <if test="item.ownerType != null">#{item.ownerType},</if>
+                <if test="item.owner != null">#{item.owner},</if>
+                <if test="item.documentStatus != null">#{item.documentStatus},</if>
+                <if test="item.detailedRemarks != null">#{item.detailedRemarks},</if>
+                <if test="item.createById != null">#{item.createById},</if>
+                <if test="item.createBy != null">#{item.createBy},</if>
+                <if test="item.createTime != null">#{item.createTime},</if>
+                <if test="item.updateById != null">#{item.updateById},</if>
+                <if test="item.updateBy != null">#{item.updateBy},</if>
+                <if test="item.updateTime != null">#{item.updateTime},</if>
+                <if test="item.delFlag != null">#{item.delFlag},</if>
+                <if test="item.productCode != null ">#{item.productCode},</if>
+                <if test="item.productName != null ">#{item.productName},</if>
+                <if test="item.productModel != null ">#{item.productModel},</if>
+                <if test="item.productSpecification != null ">#{item.productSpecification},</if>
+                <if test="item.materialType!=null">#{item.materialType},</if>
+                <if test="item.flowSequenceNumber!=null">#{item.flowSequenceNumber},</if>
+                <if test="item.process!=null">#{item.process}</if>
+            </trim>
+        </foreach>
+    </insert>
+
+    <update id="updateMaterialRetentionLog" parameterType="com.zkqy.amichi.domain.MaterialRetentionLog">
+        update fjqydb.material_retention_log
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="materialCode != null and materialCode != ''">material_code = #{materialCode},</if>
+            <if test="materialName != null and materialName != ''">material_name = #{materialName},</if>
+            <if test="specification != null">specification = #{specification},</if>
+            <if test="model != null">model = #{model},</if>
+            <if test="unit != null">unit = #{unit},</if>
+            <if test="actualQuantityIssued != null">actual_quantity_issued = #{actualQuantityIssued},</if>
+            <if test="deliveryWarehouse != null">delivery_warehouse = #{deliveryWarehouse},</if>
+            <if test="ckNumber != null">ck_number = #{ckNumber},</if>
+            <if test="documentRemarks != null">document_remarks = #{documentRemarks},</if>
+            <if test="documentType != null">document_type = #{documentType},</if>
+            <if test="inventoryOrganization != null">inventory_organization = #{inventoryOrganization},</if>
+            <if test="receivingTissue != null">receiving_tissue = #{receivingTissue},</if>
+            <if test="inventoryDirection != null">inventory_direction = #{inventoryDirection},</if>
+            <if test="dateOfDelivery != null">date_of_delivery = #{dateOfDelivery},</if>
+            <if test="materialsRequisitionDepartment != null">materials_requisition_department = #{materialsRequisitionDepartment},</if>
+            <if test="materialTaker != null">material_taker = #{materialTaker},</if>
+            <if test="businessType != null">business_type = #{businessType},</if>
+            <if test="ownerType != null">owner_type = #{ownerType},</if>
+            <if test="owner != null">owner = #{owner},</if>
+            <if test="documentStatus != null">document_status = #{documentStatus},</if>
+            <if test="detailedRemarks != null">detailed_remarks = #{detailedRemarks},</if>
+            <if test="createById != null">create_by_id = #{createById},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateById != null">update_by_id = #{updateById},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="productCode != null ">product_code = #{productCode}</if>
+            <if test="productName != null ">product_name = #{productName}</if>
+            <if test="productModel != null ">product_model = #{productModel}</if>
+            <if test="productSpecification != null ">product_specification = #{productSpecification}</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteMaterialRetentionLogById" parameterType="Long">
+        delete from fjqydb.material_retention_log where id = #{id}
+    </delete>
+
+    <delete id="deleteMaterialRetentionLogByIds" parameterType="String">
+        delete from fjqydb.material_retention_log where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 1 - 1
zkqy-fujian-amichi/src/main/resources/mapper/PlanTaskDetailsMapper.xml

@@ -384,7 +384,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
               on ptd.material_id=mbi.material_code
                   left join fjqydb.production_planning_management  as  ppm
                             on pcf.production_order_list_id =ppm.order_number
-        where ppm.is_weld_sheet=1 and  pcf.production_order_list_id in
+        where ppm.is_weld_sheet=1 and  pcf.demand_document_number in
         <foreach item="orderNumber" collection="list" open="(" separator="," close=")">
             #{orderNumber}
         </foreach>

+ 96 - 0
zkqy-fujian-amichi/src/main/resources/mapper/ProcedureListMapper.xml

@@ -0,0 +1,96 @@
+<?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.zkqy.amichi.mapper.ProcedureListMapper">
+    
+    <resultMap type="com.zkqy.amichi.domain.ProcedureList" id="ProcedureListResult">
+        <result property="id"    column="id"    />
+        <result property="procedureNumber"    column="procedure_number"    />
+        <result property="procedurName"    column="procedur_name"    />
+        <result property="remarks"    column="remarks"    />
+        <result property="createById"    column="create_by_id"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateById"    column="update_by_id"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="delFlag"    column="del_flag"    />
+    </resultMap>
+
+    <sql id="selectProcedureListVo">
+        select id, procedure_number, procedur_name, remarks, create_by_id, create_by, create_time, update_by_id, update_by, update_time, del_flag from fjqydb.procedure_list
+    </sql>
+
+    <select id="selectProcedureListList" parameterType="com.zkqy.amichi.domain.ProcedureList" resultMap="ProcedureListResult">
+        <include refid="selectProcedureListVo"/>
+        <where>  
+            <if test="procedureNumber != null  and procedureNumber != ''"> and procedure_number = #{procedureNumber}</if>
+            <if test="procedurName != null  and procedurName != ''"> and procedur_name like concat('%', #{procedurName}, '%')</if>
+            <if test="remarks != null  and remarks != ''"> and remarks = #{remarks}</if>
+            <if test="createById != null "> and create_by_id = #{createById}</if>
+            <if test="updateById != null "> and update_by_id = #{updateById}</if>
+        </where>
+    </select>
+    
+    <select id="selectProcedureListById" parameterType="Long" resultMap="ProcedureListResult">
+        <include refid="selectProcedureListVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertProcedureList" parameterType="com.zkqy.amichi.domain.ProcedureList" useGeneratedKeys="true" keyProperty="id">
+        insert into fjqydb.procedure_list
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="procedureNumber != null and procedureNumber != ''">procedure_number,</if>
+            <if test="procedurName != null and procedurName != ''">procedur_name,</if>
+            <if test="remarks != null">remarks,</if>
+            <if test="createById != null">create_by_id,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateById != null">update_by_id,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="delFlag != null">del_flag,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="procedureNumber != null and procedureNumber != ''">#{procedureNumber},</if>
+            <if test="procedurName != null and procedurName != ''">#{procedurName},</if>
+            <if test="remarks != null">#{remarks},</if>
+            <if test="createById != null">#{createById},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateById != null">#{updateById},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+         </trim>
+    </insert>
+
+    <update id="updateProcedureList" parameterType="com.zkqy.amichi.domain.ProcedureList">
+        update fjqydb.procedure_list
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="procedureNumber != null and procedureNumber != ''">procedure_number = #{procedureNumber},</if>
+            <if test="procedurName != null and procedurName != ''">procedur_name = #{procedurName},</if>
+            <if test="remarks != null">remarks = #{remarks},</if>
+            <if test="createById != null">create_by_id = #{createById},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateById != null">update_by_id = #{updateById},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteProcedureListById" parameterType="Long">
+        delete from fjqydb.procedure_list where id = #{id}
+    </delete>
+
+    <delete id="deleteProcedureListByIds" parameterType="String">
+        delete from fjqydb.procedure_list where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 92 - 0
zkqy-fujian-amichi/src/main/resources/mapper/RingScanInformationFirstMapper.xml

@@ -0,0 +1,92 @@
+<?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.zkqy.amichi.mapper.RingScanInformationFirstMapper">
+    
+    <resultMap type="com.zkqy.amichi.domain.RingScanInformationFirst" id="RingScanInformationFirstResult">
+        <result property="id"    column="id"    />
+        <result property="orderNumber"    column="order_number"    />
+        <result property="productionOrderNumber"    column="production_order_number"    />
+        <result property="status"    column="status"    />
+        <result property="startTime"    column="start_time"    />
+        <result property="endTime"    column="end_time"    />
+        <result property="packingQuantity"    column="packing_quantity"    />
+        <result property="inspectionQuantity"    column="inspection_quantity"    />
+        <result property="totalQuantity"    column="total_quantity"    />
+    </resultMap>
+
+    <sql id="selectRingScanInformationFirstVo">
+        select id, order_number, production_order_number, status,start_time,end_time,packing_quantity,inspection_quantity,total_quantity
+        from fjqydb.ring_scan_information_first
+    </sql>
+
+    <select id="selectRingScanInformationFirstList" parameterType="com.zkqy.amichi.domain.RingScanInformationFirst" resultMap="RingScanInformationFirstResult">
+        <include refid="selectRingScanInformationFirstVo"/>
+        <where>  
+            <if test="orderNumber != null  and orderNumber != ''"> and order_number = #{orderNumber}</if>
+            <if test="productionOrderNumber != null  and productionOrderNumber != ''"> and production_order_number = #{productionOrderNumber}</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+            <if test="startTime != null  and startTime != ''"> and start_time = #{startTime}</if>
+            <if test="endTime != null  and endTime != ''"> and end_time = #{endTime}</if>
+            <if test="packingQuantity != null  and packingQuantity != ''"> and packing_quantity = #{packingQuantity}</if>
+            <if test="inspectionQuantity != null  and inspectionQuantity != ''"> and inspection_quantity = #{inspectionQuantity}</if>
+            <if test="totalQuantity != null  and totalQuantity != ''"> and total_quantity = #{totalQuantity}</if>
+        </where>
+    </select>
+    
+    <select id="selectRingScanInformationFirstById" parameterType="Long" resultMap="RingScanInformationFirstResult">
+        <include refid="selectRingScanInformationFirstVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertRingScanInformationFirst" parameterType="com.zkqy.amichi.domain.RingScanInformationFirst" useGeneratedKeys="true" keyProperty="id">
+        insert into fjqydb.ring_scan_information_first
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="orderNumber != null">order_number,</if>
+            <if test="productionOrderNumber != null">production_order_number,</if>
+            <if test="status != null">status,</if>
+            <if test="startTime != null">start_time,</if>
+            <if test="endTime != null">end_time,</if>
+            <if test="packingQuantity != null  and packingQuantity != ''">packing_quantity,</if>
+            <if test="inspectionQuantity != null  and inspectionQuantity != ''">inspection_quantity,</if>
+            <if test="totalQuantity != null  and totalQuantity != ''">total_quantity</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="orderNumber != null">#{orderNumber},</if>
+            <if test="productionOrderNumber != null">#{productionOrderNumber},</if>
+            <if test="status != null">#{status},</if>
+            <if test="startTime != null">#{startTime},</if>
+            <if test="endTime != null">#{endTime},</if>
+            <if test="packingQuantity != null  and packingQuantity != ''">#{packingQuantity},</if>
+            <if test="inspectionQuantity != null  and inspectionQuantity != ''">#{inspectionQuantity},</if>
+            <if test="totalQuantity != null  and totalQuantity != ''">#{totalQuantity}</if>
+         </trim>
+    </insert>
+
+    <update id="updateRingScanInformationFirst" parameterType="com.zkqy.amichi.domain.RingScanInformationFirst">
+        update fjqydb.ring_scan_information_first
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="orderNumber != null">order_number = #{orderNumber},</if>
+            <if test="productionOrderNumber != null">production_order_number = #{productionOrderNumber},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="startTime != null  and startTime != ''">start_time = #{startTime}</if>
+            <if test="endTime != null  and endTime != ''">end_time = #{endTime}</if>
+            <if test="packingQuantity != null  and packingQuantity != ''"> packing_quantity = #{packingQuantity}</if>
+            <if test="inspectionQuantity != null  and inspectionQuantity != ''">inspection_quantity = #{inspectionQuantity}</if>
+            <if test="totalQuantity != null  and totalQuantity != ''">total_quantity = #{totalQuantity}</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteRingScanInformationFirstById" parameterType="Long">
+        delete from fjqydb.ring_scan_information_first where id = #{id}
+    </delete>
+
+    <delete id="deleteRingScanInformationFirstByIds" parameterType="String">
+        delete from fjqydb.ring_scan_information_first where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 55 - 1
zkqy-fujian-amichi/src/main/resources/mapper/RingScanInformationMapper.xml

@@ -10,10 +10,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="deviceName"    column="device_name"    />
         <result property="scanningTime"    column="scanning_time"    />
         <result property="contentInformation"    column="content_information"    />
+        <result property="personnelName"    column="personnel_name"    />
     </resultMap>
 
     <sql id="selectRingScanInformationVo">
-        select id, device_number, device_name, scanning_time, content_information from fjqydb.ring_scan_information
+        select id, device_number, device_name, scanning_time, content_information,personnel_name from fjqydb.ring_scan_information
     </sql>
 
     <select id="selectRingScanInformationList" parameterType="com.zkqy.amichi.domain.RingScanInformation" resultMap="RingScanInformationResult">
@@ -104,6 +105,49 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         order by scanning_time DESC
         LIMIT 1
     </select>
+    <select id="SelectRingScanInformationLog" resultType="com.zkqy.amichi.domain.vo.RingScanInformationLogVo">
+        SELECT
+            sub.count,
+            sub.process_name,
+            sub.native_numbering,
+            sub.order_number,
+            sub.scanning_time,
+            sub.sort,
+            rsif.`status`,
+            rsif.start_time,
+            rsif.end_time,
+            rsif.total_quantity
+        FROM
+            (
+                SELECT
+                    rsi.process_name,
+                    rsi.native_numbering,
+                    rsi.order_number,
+                    COUNT( rsi.process_name ) AS count,
+		            MAX( rsi.scanning_time ) AS scanning_time,
+		            pl.sort
+                FROM
+                    fjqydb.ring_scan_information AS rsi
+                    LEFT JOIN fjqydb.procedure_list AS pl ON pl.procedur_name = rsi.process_name
+                GROUP BY
+                    rsi.order_number,
+                    rsi.process_name
+            ) AS sub
+                LEFT JOIN fjqydb.ring_scan_information_first AS rsif ON ( sub.order_number = rsif.order_number )
+        <where>
+            <if test="list != null and list.size()>0">
+                sub.order_number IN
+                    <foreach item="id" collection="list" open="(" separator="," close=")">
+                        #{id}
+                    </foreach>
+            </if>
+            <if test="list == null or list.size() == 0">
+                rsi.order_number = 'X'
+            </if>
+        </where>
+        ORDER BY
+            sub.order_number,sub.sort
+    </select>
 
     <insert id="insertRingScanInformation" parameterType="com.zkqy.amichi.domain.RingScanInformation" useGeneratedKeys="true" keyProperty="id">
         insert into fjqydb.ring_scan_information
@@ -113,6 +157,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="scanningTime != null">scanning_time,</if>
             <if test="contentInformation != null">content_information,</if>
             <if test="nativeNumbering != null">native_numbering,</if>
+            <if test="personnelName != null">personnel_name,</if>
+            <if test="process != null">process,</if>
+            <if test="processName != null">process_name,</if>
+            <if test="orderNumber != null">order_number,</if>
+            <if test="productionOrderNumber != null">production_order_number,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="deviceNumber != null">#{deviceNumber},</if>
@@ -120,6 +169,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="scanningTime != null">#{scanningTime},</if>
             <if test="contentInformation != null">#{contentInformation},</if>
             <if test="nativeNumbering != null">#{nativeNumbering},</if>
+            <if test="personnelName != null">#{personnelName},</if>
+            <if test="process != null">#{process},</if>
+            <if test="processName != null">#{processName},</if>
+            <if test="orderNumber != null">#{orderNumber},</if>
+            <if test="productionOrderNumber != null">#{productionOrderNumber},</if>
          </trim>
     </insert>
 

+ 96 - 0
zkqy-fujian-amichi/src/main/resources/mapper/RingTerminalMapper.xml

@@ -0,0 +1,96 @@
+<?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.zkqy.amichi.mapper.RingTerminalMapper">
+    
+    <resultMap type="com.zkqy.amichi.domain.RingTerminal" id="RingTerminalResult">
+        <result property="id"    column="id"    />
+        <result property="handheldTerminalNumber"    column="handheld_terminal_number"    />
+        <result property="handheldTerminalName"    column="handheld_terminal_name"    />
+        <result property="remarks"    column="remarks"    />
+        <result property="createById"    column="create_by_id"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateById"    column="update_by_id"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="delFlag"    column="del_flag"    />
+    </resultMap>
+
+    <sql id="selectRingTerminalVo">
+        select id, handheld_terminal_number, handheld_terminal_name, remarks, create_by_id, create_by, create_time, update_by_id, update_by, update_time, del_flag from fjqydb.ring_terminal
+    </sql>
+
+    <select id="selectRingTerminalList" parameterType="com.zkqy.amichi.domain.RingTerminal" resultMap="RingTerminalResult">
+        <include refid="selectRingTerminalVo"/>
+        <where>  
+            <if test="handheldTerminalNumber != null  and handheldTerminalNumber != ''"> and handheld_terminal_number = #{handheldTerminalNumber}</if>
+            <if test="handheldTerminalName != null  and handheldTerminalName != ''"> and handheld_terminal_name like concat('%', #{handheldTerminalName}, '%')</if>
+            <if test="remarks != null  and remarks != ''"> and remarks = #{remarks}</if>
+            <if test="createById != null "> and create_by_id = #{createById}</if>
+            <if test="updateById != null "> and update_by_id = #{updateById}</if>
+        </where>
+    </select>
+    
+    <select id="selectRingTerminalById" parameterType="Long" resultMap="RingTerminalResult">
+        <include refid="selectRingTerminalVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertRingTerminal" parameterType="com.zkqy.amichi.domain.RingTerminal" useGeneratedKeys="true" keyProperty="id">
+        insert into fjqydb.ring_terminal
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="handheldTerminalNumber != null and handheldTerminalNumber != ''">handheld_terminal_number,</if>
+            <if test="handheldTerminalName != null and handheldTerminalName != ''">handheld_terminal_name,</if>
+            <if test="remarks != null">remarks,</if>
+            <if test="createById != null">create_by_id,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateById != null">update_by_id,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="delFlag != null">del_flag,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="handheldTerminalNumber != null and handheldTerminalNumber != ''">#{handheldTerminalNumber},</if>
+            <if test="handheldTerminalName != null and handheldTerminalName != ''">#{handheldTerminalName},</if>
+            <if test="remarks != null">#{remarks},</if>
+            <if test="createById != null">#{createById},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateById != null">#{updateById},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+         </trim>
+    </insert>
+
+    <update id="updateRingTerminal" parameterType="com.zkqy.amichi.domain.RingTerminal">
+        update fjqydb.ring_terminal
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="handheldTerminalNumber != null and handheldTerminalNumber != ''">handheld_terminal_number = #{handheldTerminalNumber},</if>
+            <if test="handheldTerminalName != null and handheldTerminalName != ''">handheld_terminal_name = #{handheldTerminalName},</if>
+            <if test="remarks != null">remarks = #{remarks},</if>
+            <if test="createById != null">create_by_id = #{createById},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateById != null">update_by_id = #{updateById},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteRingTerminalById" parameterType="Long">
+        delete from fjqydb.ring_terminal where id = #{id}
+    </delete>
+
+    <delete id="deleteRingTerminalByIds" parameterType="String">
+        delete from fjqydb.ring_terminal where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 21 - 2
zkqy-fujian-amichi/src/main/resources/mapper/TerminalInformationMapper.xml

@@ -20,10 +20,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="dataApprovalStatus"    column="data_approval_status"    />
         <result property="processKey"    column="process_key"    />
         <result property="taskProcessKey"    column="task_process_key"    />
+        <result property="personnelName"    column="personnel_name"    />
+        <result property="process" column="process"></result>
+        <result property="processName" column="process_name"></result>
+        <result property="terminalName" column="terminal_name"></result>
     </resultMap>
 
     <sql id="selectTerminalInformationVo">
-        select id, terminal_id, station_name, device_id, remark, create_by_id, create_by, create_time, update_by_id, update_by, update_time, del_flag, data_approval_status, process_key, task_process_key from fjqydb.terminal_information
+        select id, terminal_id, station_name, device_id, remark, create_by_id, create_by, create_time, update_by_id, update_by, update_time, del_flag, data_approval_status,
+               process_key, task_process_key,personnel_name,process,process_name,terminal_name from fjqydb.terminal_information
     </sql>
 
     <select id="selectTerminalInformationList" parameterType="com.zkqy.amichi.domain.TerminalInformation" resultMap="TerminalInformationResult">
@@ -37,6 +42,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="dataApprovalStatus != null  and dataApprovalStatus != ''"> and data_approval_status = #{dataApprovalStatus}</if>
             <if test="processKey != null  and processKey != ''"> and process_key = #{processKey}</if>
             <if test="taskProcessKey != null  and taskProcessKey != ''"> and task_process_key = #{taskProcessKey}</if>
+            <if test="process != null  and process != ''"> and process = #{process}</if>
+            <if test="processName != null  and processName != ''"> and process_name = #{processName}</if>
+            <if test="terminalName != null  and terminalName != ''"> and terminal_name = #{terminalName}</if>
         </where>
     </select>
     
@@ -62,6 +70,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="dataApprovalStatus != null">data_approval_status,</if>
             <if test="processKey != null">process_key,</if>
             <if test="taskProcessKey != null">task_process_key,</if>
+            <if test="personnelName != null">personnel_name,</if>
+            <if test="process != null  and process != ''">process,</if>
+            <if test="processName!=null and processName!=''">process_name,</if>
+            <if test="terminalName != null  and terminalName != ''">terminal_name</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="terminalId != null">#{terminalId},</if>
@@ -77,7 +89,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="delFlag != null">#{delFlag},</if>
             <if test="dataApprovalStatus != null">#{dataApprovalStatus},</if>
             <if test="processKey != null">#{processKey},</if>
-            <if test="taskProcessKey != null">#{taskProcessKey},</if>
+            <if test="personnelName != null">#{personnelName},</if>
+            <if test="process != null  and process != ''">#{process},</if>
+            <if test="processName!=null and processName!=''">#{processName},</if>
+            <if test="terminalName != null  and terminalName != ''">#{terminalName}</if>
          </trim>
     </insert>
 
@@ -98,6 +113,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="dataApprovalStatus != null">data_approval_status = #{dataApprovalStatus},</if>
             <if test="processKey != null">process_key = #{processKey},</if>
             <if test="taskProcessKey != null">task_process_key = #{taskProcessKey},</if>
+            <if test="personnelName != null">personnel_name=#{personnelName},</if>
+            <if test="process != null  and process != ''">process=#{process},</if>
+            <if test="processName!=null and processName!=''">process_name=#{processName},</if>
+            <if test="terminalName != null  and terminalName != ''">terminal_name=#{terminalName}</if>
         </trim>
         where id = #{id}
     </update>

+ 50 - 0
zkqy-ui/src/api/amichi/RingTerminal/terminal.js

@@ -0,0 +1,50 @@
+import request from '@/utils/request'
+
+// 查询指环终端列表
+export function listRingTerminal(query) {
+  return request({
+    url: '/RingTerminal/terminal/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询指环终端详细
+export function getRingTerminal(id) {
+  return request({
+    url: '/RingTerminal/terminal/' + id,
+    method: 'get'
+  })
+}
+
+// 新增指环终端
+export function addRingTerminal(data) {
+  return request({
+    url: '/RingTerminal/terminal',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改指环终端
+export function updateRingTerminal(data) {
+  return request({
+    url: '/RingTerminal/terminal',
+    method: 'put',
+    data: data
+  })
+}
+export function getQrCodeToRing(data) {
+  return request({
+    url: 'RingTerminal/terminal/getQrCodeToRing/img',
+    method: 'get',
+  })
+}
+
+// 删除指环终端
+export function delRingTerminal(id) {
+  return request({
+    url: '/RingTerminal/terminal/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
zkqy-ui/src/api/amichi/handheldTerminal/terminal.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询扫码扣料日志列表
+export function listTerminal(query) {
+  return request({
+    url: '/handheldTerminal/terminal/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询扫码扣料日志详细
+export function getTerminal(id) {
+  return request({
+    url: '/handheldTerminal/terminal/' + id,
+    method: 'get'
+  })
+}
+
+// 新增扫码扣料日志
+export function addTerminal(data) {
+  return request({
+    url: '/handheldTerminal/terminal',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改扫码扣料日志
+export function updateTerminal(data) {
+  return request({
+    url: '/handheldTerminal/terminal',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除扫码扣料日志
+export function delTerminal(id) {
+  return request({
+    url: '/handheldTerminal/terminal/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
zkqy-ui/src/api/amichi/materialRetentionLog/log.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询扫码扣料日志列表
+export function listLog(query) {
+  return request({
+    url: '/materialRetentionLog/log/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询扫码扣料日志详细
+export function getLog(id) {
+  return request({
+    url: '/materialRetentionLog/log/' + id,
+    method: 'get'
+  })
+}
+
+// 新增扫码扣料日志
+export function addLog(data) {
+  return request({
+    url: '/materialRetentionLog/log',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改扫码扣料日志
+export function updateLog(data) {
+  return request({
+    url: '/materialRetentionLog/log',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除扫码扣料日志
+export function delLog(id) {
+  return request({
+    url: '/materialRetentionLog/log/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
zkqy-ui/src/api/amichi/procedureList/list.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询工序列表列表
+export function listList(query) {
+  return request({
+    url: '/procedureList/list/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询工序列表详细
+export function getList(id) {
+  return request({
+    url: '/procedureList/list/' + id,
+    method: 'get'
+  })
+}
+
+// 新增工序列表
+export function addList(data) {
+  return request({
+    url: '/procedureList/list',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改工序列表
+export function updateList(data) {
+  return request({
+    url: '/procedureList/list',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除工序列表
+export function delList(id) {
+  return request({
+    url: '/procedureList/list/' + id,
+    method: 'delete'
+  })
+}

+ 8 - 0
zkqy-ui/src/api/amichi/ringScanInformation/index.js

@@ -8,6 +8,14 @@ export function listInformation(query) {
     params: query
   })
 }
+// 按照流程管道的方式展示日志
+export function scanCodeMonitoringLogs(query) {
+  return request({
+    url: '/amichi/ringScanInformation/info/scanCodeMonitoringLogs',
+    method: 'get',
+    params: query
+  })
+}
 
 // 查询指环王扫描日志信息详细
 export function getInformation(id) {

+ 8 - 1
zkqy-ui/src/api/system/user.js

@@ -9,7 +9,14 @@ export function listUser(query) {
     params: query
   })
 }
-
+// 查询用户列表
+export function generateEmployeeCode(query) {
+  return request({
+    url: '/amichi/ringScanInformation/generate/generateEmployeeCode',
+    method: 'get',
+    params: query
+  })
+}
 // 查询用户详细
 export function getUser(userId) {
   console.log(userId, "dddddd")

+ 4 - 5
zkqy-ui/src/layout/components/Sidebar/index.vue

@@ -1,4 +1,5 @@
 <template>
+  <!--        :default-openeds="openList"-->
   <div
     :class="{ 'has-logo': showLogo }"
     :style="{
@@ -11,7 +12,6 @@
     <logo v-if="showLogo" :collapse="isCollapse" />
     <el-scrollbar :class="settings.sideTheme" wrap-class="scrollbar-wrapper">
       <el-menu
-        :default-openeds="openList"
         :default-active="activeMenu"
         :collapse="isCollapse"
         :background-color="
@@ -79,9 +79,9 @@ export default {
       // return true
       // return false;
     },
-    openList() {
-      return this.sidebarRouters.map((item) => item.path);
-    },
+    // openList() {
+    //   return this.sidebarRouters.map((item) => item.path);
+    // },
   },
   methods: {
     onLayoutResize() {
@@ -89,7 +89,6 @@ export default {
       const rect = document.body.getBoundingClientRect();
       if (rect.width - 1 < WIDTH) {
         // this.$store.dispatch("app/closeSideBar", { withoutAnimation: true });
-
         this.isCollapse = true;
       } else {
         this.isCollapse = false;

+ 1 - 0
zkqy-ui/src/router/index.js

@@ -420,6 +420,7 @@ export const dynamicRoutes = [
 // 防止连续点击多次路由报错
 let routerPush = Router.prototype.push;
 let routerReplace = Router.prototype.replace;
+
 // push
 Router.prototype.push = function push(location) {
   return routerPush.call(this, location).catch(err => err)

+ 402 - 0
zkqy-ui/src/views/amichi/MaterialRetentionLog/index.vue

@@ -0,0 +1,402 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="物料编码" prop="materialCode">
+        <el-input
+          v-model="queryParams.materialCode"
+          placeholder="请输入物料编码"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="物料名称" prop="materialName">
+        <el-input
+          v-model="queryParams.materialName"
+          placeholder="请输入物料名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['materialRetentionLog:log:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['materialRetentionLog:log:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['materialRetentionLog:log:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['materialRetentionLog:log:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading"  style="margin-top: 20px" :data="logList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="产品编码" align="center" prop="productCode" />
+      <el-table-column label="物料编码" align="center" prop="materialCode" />
+      <el-table-column label="物料名称" align="center" prop="materialName" />
+      <el-table-column label="规格" align="center" prop="specification" />
+      <el-table-column label="子项类型" align="center" prop="materialType" >
+          <template  v-slot="scope">
+            <dict-tag  :options="dict.type.wlmxzxlx" :value="scope.row.materialType"/>
+          </template>
+      </el-table-column>
+      <el-table-column label="单位" align="center" prop="unit" />
+      <el-table-column label="实发数量" align="center" prop="actualQuantityIssued" />
+      <el-table-column label="发货仓库" align="center" prop="deliveryWarehouse" />
+      <el-table-column label="工序" align="center" prop="process" />
+<!--      <el-table-column label="仓库仓库编码" align="center" prop="ckNumber" />-->
+<!--      <el-table-column label="单据备注" align="center" prop="documentRemarks" />-->
+      <el-table-column label="明细备注" align="center" prop="detailedRemarks" />
+<!--      <el-table-column label="单据类型" align="center" prop="documentType" />-->
+<!--      <el-table-column label="库存组织" align="center" prop="inventoryOrganization" />-->
+<!--      <el-table-column label="库存组织" align="center" prop="receivingTissue" />-->
+<!--      <el-table-column label="库存方向" align="center" prop="inventoryDirection" />-->
+<!--      <el-table-column label="出库日期" align="center" prop="dateOfDelivery" />-->
+<!--      <el-table-column label="领料部门" align="center" prop="materialsRequisitionDepartment" />-->
+<!--      <el-table-column label="领料人" align="center" prop="materialTaker" />-->
+<!--      <el-table-column label="业务类型" align="center" prop="businessType" />-->
+<!--      <el-table-column label="货主类型" align="center" prop="ownerType" />-->
+<!--      <el-table-column label="货主" align="center" prop="owner" />-->
+<!--      <el-table-column label="单据状态" align="center" prop="documentStatus" />-->
+
+<!--      <el-table-column label="创建者id " align="center" prop="createById" />-->
+<!--      <el-table-column label="更新者id" align="center" prop="updateById" />-->
+<!--      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->
+<!--        <template slot-scope="scope">-->
+<!--          <el-dropdown @command="(command)=>{handleCommand(command, scope.row)}">-->
+<!--            <el-button type="warning">-->
+<!--              操作<i class="el-icon-arrow-down el-icon&#45;&#45;right"></i>-->
+<!--            </el-button>-->
+<!--            <el-dropdown-menu slot="dropdown">-->
+<!--              <el-dropdown-item  icon="el-icon-edit"  command="handleUpdate">修改</el-dropdown-item>-->
+<!--              <el-dropdown-item  icon="el-icon-delete" command="handleDelete">删除</el-dropdown-item>-->
+<!--            </el-dropdown-menu>-->
+<!--          </el-dropdown>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改扫码扣料日志对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="物料编码" prop="materialCode">
+          <el-input v-model="form.materialCode" placeholder="请输入物料编码" />
+        </el-form-item>
+        <el-form-item label="物料名称" prop="materialName">
+          <el-input v-model="form.materialName" placeholder="请输入物料名称" />
+        </el-form-item>
+        <el-form-item label="规格" prop="specification">
+          <el-input v-model="form.specification" placeholder="请输入规格" />
+        </el-form-item>
+        <el-form-item label="型号" prop="model">
+          <el-input v-model="form.model" placeholder="请输入型号" />
+        </el-form-item>
+        <el-form-item label="单位" prop="unit">
+          <el-input v-model="form.unit" placeholder="请输入单位" />
+        </el-form-item>
+        <el-form-item label="实发数量" prop="actualQuantityIssued">
+          <el-input v-model="form.actualQuantityIssued" placeholder="请输入实发数量" />
+        </el-form-item>
+        <el-form-item label="发货仓库" prop="deliveryWarehouse">
+          <el-input v-model="form.deliveryWarehouse" placeholder="请输入发货仓库" />
+        </el-form-item>
+        <el-form-item label="仓库仓库编码" prop="ckNumber">
+          <el-input v-model="form.ckNumber" placeholder="请输入仓库仓库编码" />
+        </el-form-item>
+        <el-form-item label="单据备注" prop="documentRemarks">
+          <el-input v-model="form.documentRemarks" placeholder="请输入单据备注" />
+        </el-form-item>
+        <el-form-item label="库存组织" prop="inventoryOrganization">
+          <el-input v-model="form.inventoryOrganization" placeholder="请输入库存组织" />
+        </el-form-item>
+        <el-form-item label="库存组织" prop="receivingTissue">
+          <el-input v-model="form.receivingTissue" placeholder="请输入库存组织" />
+        </el-form-item>
+        <el-form-item label="库存方向" prop="inventoryDirection">
+          <el-input v-model="form.inventoryDirection" placeholder="请输入库存方向" />
+        </el-form-item>
+        <el-form-item label="出库日期" prop="dateOfDelivery">
+          <el-input v-model="form.dateOfDelivery" placeholder="请输入出库日期" />
+        </el-form-item>
+        <el-form-item label="领料部门" prop="materialsRequisitionDepartment">
+          <el-input v-model="form.materialsRequisitionDepartment" placeholder="请输入领料部门" />
+        </el-form-item>
+        <el-form-item label="领料人" prop="materialTaker">
+          <el-input v-model="form.materialTaker" placeholder="请输入领料人" />
+        </el-form-item>
+        <el-form-item label="货主" prop="owner">
+          <el-input v-model="form.owner" placeholder="请输入货主" />
+        </el-form-item>
+        <el-form-item label="明细备注" prop="detailedRemarks">
+          <el-input v-model="form.detailedRemarks" placeholder="请输入明细备注" />
+        </el-form-item>
+        <el-form-item label="创建者id " prop="createById">
+          <el-input v-model="form.createById" placeholder="请输入创建者id " />
+        </el-form-item>
+        <el-form-item label="更新者id" prop="updateById">
+          <el-input v-model="form.updateById" placeholder="请输入更新者id" />
+        </el-form-item>
+        <el-form-item label="删除标志" prop="delFlag">
+          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listLog, getLog, delLog, addLog, updateLog } from "@/api/amichi/materialRetentionLog/log";
+
+export default {
+  name: "Log",
+  dicts: ["wlmxzxlx"],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 扫码扣料日志表格数据
+      logList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        materialCode: null,
+        materialName: null,
+        specification: null,
+        model: null,
+        unit: null,
+        actualQuantityIssued: null,
+        deliveryWarehouse: null,
+        ckNumber: null,
+        documentRemarks: null,
+        documentType: null,
+        inventoryOrganization: null,
+        receivingTissue: null,
+        inventoryDirection: null,
+        dateOfDelivery: null,
+        materialsRequisitionDepartment: null,
+        materialTaker: null,
+        businessType: null,
+        ownerType: null,
+        owner: null,
+        documentStatus: null,
+        detailedRemarks: null,
+        createById: null,
+        updateById: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        materialCode: [
+          { required: true, message: "物料编码不能为空", trigger: "blur" }
+        ],
+        materialName: [
+          { required: true, message: "物料名称不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询扫码扣料日志列表 */
+    getList() {
+      this.loading = true;
+      listLog(this.queryParams).then(response => {
+        this.logList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    //下拉菜单点击事件
+    handleCommand(command, row) {
+      switch (command) {
+        case "handleUpdate":
+          this.handleUpdate(row)
+          break;
+        case "handleDelete":
+          this.handleDelete(row)
+          break;
+        default:
+          break;
+      }
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        materialCode: null,
+        materialName: null,
+        specification: null,
+        model: null,
+        unit: null,
+        actualQuantityIssued: null,
+        deliveryWarehouse: null,
+        ckNumber: null,
+        documentRemarks: null,
+        documentType: null,
+        inventoryOrganization: null,
+        receivingTissue: null,
+        inventoryDirection: null,
+        dateOfDelivery: null,
+        materialsRequisitionDepartment: null,
+        materialTaker: null,
+        businessType: null,
+        ownerType: null,
+        owner: null,
+        documentStatus: null,
+        detailedRemarks: null,
+        createById: null,
+        createBy: null,
+        createTime: null,
+        updateById: null,
+        updateBy: null,
+        updateTime: null,
+        delFlag: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加扫码扣料日志";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getLog(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改扫码扣料日志";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateLog(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addLog(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除扫码扣料日志编号为"' + ids + '"的数据项?').then(function() {
+        return delLog(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('materialRetentionLog/log/export', {
+        ...this.queryParams
+      }, `log_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 43 - 0
zkqy-ui/src/views/amichi/RingTerminal/terminal/RingAdd.vue

@@ -0,0 +1,43 @@
+<template>
+  <div class="box" style="width: 500px;height: 500px">
+<!--    <h1 style="font-size: 30px;text-align: center">扫描二维码进行手环添加</h1>-->
+    <img :src="imgUrlBase" alt="扫描二维码进行手环添加" style="margin-top: 160px">
+  </div>
+</template>
+
+<script>
+  import {getQrCodeToRing} from "@/api/amichi/RingTerminal/terminal";
+
+
+  export default {
+    name: "RingAdd",
+    data () {
+      return {
+        imgUrlBase:""
+      }
+    },
+    methods: {
+      getQrCodeToRingApi(){
+        getQrCodeToRing(this.queryParams).then(response => {
+          this.imgUrlBase = response.data
+        });
+      }
+
+    },
+    mounted() {
+      this.getQrCodeToRingApi();
+    },
+    created(){
+    },
+  }
+
+</script>
+<style scoped>
+ *{
+   margin: 0 auto;
+   padding: 0;
+ }
+ .box{
+   width:100%;
+ }
+</style>

+ 307 - 0
zkqy-ui/src/views/amichi/RingTerminal/terminal/index.vue

@@ -0,0 +1,307 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="指环编号" prop="handheldTerminalNumber">
+        <el-input
+          v-model="queryParams.handheldTerminalNumber"
+          placeholder="请输入指环编号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="指环名称" prop="handheldTerminalName">
+        <el-input
+          v-model="queryParams.handheldTerminalName"
+          placeholder="请输入指环名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['RingTerminal:terminal:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['RingTerminal:terminal:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['RingTerminal:terminal:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['RingTerminal:terminal:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="zhbd"
+          v-hasPermi="['RingTerminal:terminal:add']"
+        >指环绑定二维码</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading"  style="margin-top: 20px;" :data="terminalList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+<!--      <el-table-column label="主键" align="center" prop="id" />-->
+      <el-table-column label="指环编号" align="center" prop="handheldTerminalNumber" />
+      <el-table-column label="指环名称" align="center" prop="handheldTerminalName" />
+      <el-table-column label="备注" align="center" prop="remarks" />
+
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-dropdown @command="(command)=>{handleCommand(command, scope.row)}">
+            <el-button type="warning">
+              操作<i class="el-icon-arrow-down el-icon--right"></i>
+            </el-button>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item  icon="el-icon-edit"  command="handleUpdate">修改</el-dropdown-item>
+              <el-dropdown-item  icon="el-icon-delete" command="handleDelete">删除</el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改指环终端对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="指环编号" prop="handheldTerminalNumber">
+          <el-input v-model="form.handheldTerminalNumber" placeholder="请输入指环编号" />
+        </el-form-item>
+        <el-form-item label="指环名称" prop="handheldTerminalName">
+          <el-input v-model="form.handheldTerminalName" placeholder="请输入指环名称" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listRingTerminal, getRingTerminal, delRingTerminal, addRingTerminal, updateRingTerminal } from "@/api/amichi/RingTerminal/terminal";
+
+export default {
+  name: "Terminal",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 指环终端表格数据
+      terminalList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        handheldTerminalNumber: null,
+        handheldTerminalName: null,
+        remarks: null,
+        createById: null,
+        updateById: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        handheldTerminalNumber: [
+          { required: true, message: "指环编号不能为空", trigger: "blur" }
+        ],
+        handheldTerminalName: [
+          { required: true, message: "指环名称不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    zhbd(){
+      console.log("指环绑定");
+      //完整写法
+      this.$router.push({
+        path: '/amichi/RingAdd'
+      });
+    },
+    /** 查询指环终端列表 */
+    getList() {
+      this.loading = true;
+      listRingTerminal(this.queryParams).then(response => {
+        this.terminalList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        handheldTerminalNumber: null,
+        handheldTerminalName: null,
+        remarks: null,
+        createById: null,
+        createBy: null,
+        createTime: null,
+        updateById: null,
+        updateBy: null,
+        updateTime: null,
+        delFlag: null
+      };
+      this.resetForm("form");
+    },
+    //下拉菜单点击事件
+    handleCommand(command, row) {
+      switch (command) {
+        case "handleUpdate":
+          this.handleUpdate(row)
+          break;
+        case "handleDelete":
+          this.handleDelete(row)
+          break;
+        default:
+          break;
+      }
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加指环终端";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getRingTerminal(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改指环终端";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateRingTerminal(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addRingTerminal(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除指环终端编号为"' + ids + '"的数据项?').then(function() {
+        return delRingTerminal(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('RingTerminal/terminal/export', {
+        ...this.queryParams
+      }, `terminal_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 105 - 0
zkqy-ui/src/views/amichi/dialogCompments/customizedVersion/components/TaskItem.vue

@@ -0,0 +1,105 @@
+<template>
+  <div
+    :class="{
+      'task-item-wrap': true,
+      'done-bg': itemData.totalQuantity==itemData.count,
+      'now-border': itemData.totalQuantity!=itemData.count,
+    }"
+    style="display:flex; justify-content: space-between;width: 20%"
+  >
+    <div style="width: 100%">
+      <div class="task-title">
+        <span class="mr5">工序名称:</span>
+        <span class="mr5">{{itemData.sort}}.{{itemData.processName}}</span>
+      </div>
+      <div class="completedQuantity">
+        <span class="mr5">任务数量:</span>
+        <span class="mr5">{{itemData.totalQuantity}}</span>
+      </div>
+      <div class="completedQuantity">
+        <span class="mr5">完成数量:</span>
+        <span class="mr5">{{itemData.count }}</span>
+      </div>
+      <div class="completedQuantity">
+        <span class="mr5">扫描时间:</span>
+        <span class="mr5">{{itemData.scanningTime }}</span>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "TaskItem",
+  props: ["itemData", "index","rws","num"],
+  components: {},
+  data() {
+    return {
+      cardData: {},
+      number: "",
+    };
+  },
+  watch: {
+    // myItemData: {
+    //   handler(nval) {
+    //     console.log(nval);
+    //     this.cardData = nval;
+    //   },
+    //   deep: true,
+    //   immediate: true,
+    // },
+    // myIndex: {
+    //   handler(nval) {
+    //     this.number = nval;
+    //   },
+    //   deep: true,
+    //   immediate: true,
+    // },
+  },
+  computed: {
+    // myItemData() {
+    //   return this.itemData;
+    // },
+    // myIndex() {
+    //   return this.index;
+    // },
+  },
+  methods: {},
+};
+</script>
+
+<style scoped lang="scss">
+.task-item-wrap {
+  padding: 12px 16px;
+  height: 130px;
+  flex: 1;
+  box-sizing: border-box;
+  background-color: #ebe6e6;
+  /* // margin-right: 15px; */
+  .task-title {
+    font-size: 14px;
+    font-weight: 600;
+    color: #454545;
+  }
+  .completedQuantity{
+    margin-top: 5px;
+  }
+  .msg-list {
+    display: flex;
+    flex-direction: column;
+    margin-top: 8px;
+    color: #666;
+    .msg-item {
+      .icon {
+        margin-right: 5px;
+      }
+    }
+  }
+}
+.done-bg {
+  background-color: #cdf1e5 !important;
+}
+.now-border {
+  border: 5px solid rgb(167, 238, 171) !important;
+}
+</style>

+ 161 - 0
zkqy-ui/src/views/amichi/dialogCompments/customizedVersion/components/taskList.vue

@@ -0,0 +1,161 @@
+<template>
+  <div class="task-list-wrap">
+    <div class="title-list">
+      <div class="title-item">
+        <span class="title-label">订单号:</span>
+        <span class="title-content">{{orderNumber}}</span>
+      </div>
+      <div class="title-item">
+        <span class="title-label">数量:</span>
+        <span class="title-content">{{cardData[0].totalQuantity}}</span>
+      </div>
+      <div class="title-item">
+        <span class="title-label">开始时间:</span>
+        <span class="title-content">{{cardData[0].startTime ? cardData[0].startTime.replace("T", " ") : "" }}</span>
+      </div>
+      <div class="title-item">
+        <span class="title-label" v-if="cardData[0].endTime!=null&&cardData[0].endTime!=''">完成时间:</span>
+        <span class="title-content" v-if="cardData[0].endTime!=null&&cardData[0].endTime!=''">{{cardData[0].endTime ? cardData[0].endTime.replace("T", " ") : "" }}</span>
+      </div>
+    </div>
+
+    <div class="card-list-wrap">
+      <div class="prev">
+        <i class="el-icon-arrow-left icon" @click="prevOrNext(-1)"></i>
+      </div>
+      <div class="card-list">
+        <TaskItem
+          class="card-item"
+          v-for="(item, index) of tempList"
+          :key="item.orderNumber + index"
+          :itemData="item"
+          :num="index+1"
+          :index="index + 1"
+        ></TaskItem>
+      </div>
+      <div class="next">
+        <i class="el-icon-arrow-right icon" @click="prevOrNext(1)"></i>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import TaskItem from "./TaskItem.vue";
+export default {
+  name: "TaskList",
+  props: ["cardData", "orderNumber"],
+  components: { TaskItem },
+  data() {
+    return {
+      baseInfo: {},
+      start: 0,
+      end: 5,
+      taskItemList: [],
+    };
+  },
+  computed: {
+    tempList() {
+      return this.baseInfo.slice(this.start, this.end);
+    },
+    //初始让他计算cardData
+    myCardData() {
+      return this.cardData;
+    },
+  },
+  watch: {
+    myCardData: {
+      handler(nval) {
+        this.baseInfo = nval;
+      },
+      deep: true,
+      immediate: true,
+    },
+  },
+  methods: {
+    prevOrNext(flag) {
+      if (flag == 1) {
+        if (this.end >= this.baseInfo.length) return;
+        this.start++;
+        this.end++;
+      } else {
+        if (this.start == 0) return;
+        this.start--;
+        this.end--;
+      }
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.task-list-wrap {
+  display: flex;
+  flex-direction: column;
+  width: 100%;
+  .title-list {
+    display: flex;
+    height: 34px;
+    align-items: center;
+    .title-item {
+      display: flex;
+      align-items: center;
+      margin-right: 30px;
+      font-size: 16px;
+      font-weight: 600;
+      .title-label {
+        margin-right: 10px;
+      }
+      &:last-child {
+        margin-right: 0;
+      }
+    }
+  }
+  .card-list-wrap {
+    margin: 5px 0 30px;
+    /* // height: 120px; */
+    background: #fefefe;
+    padding: 8px 5px;
+    border-radius: 4px;
+    position: relative;
+    box-shadow: inset 0 0 0 2px #eaeaea;
+    .prev {
+      position: absolute;
+      left: 0;
+      top: 50%;
+      transform: translateY(-50%);
+      font-size: 40px;
+      font-weight: 600;
+    }
+    .next {
+      position: absolute;
+      right: 0;
+      top: 50%;
+      transform: translateY(-50%);
+      font-size: 40px;
+    }
+    .icon {
+      cursor: pointer;
+      &:hover {
+        color: #4cc7ec;
+      }
+    }
+    .card-list {
+      width: auto;
+      padding: 0 26px;
+      height: 100%;
+      width: 1600px;
+      overflow: hidden;
+      display: flex;
+      /* // justify-content: space-around;\ */
+      .card-item {
+        margin-right: 15px;
+        flex: 0 0 20%; /* 每个子项占据 20% 的空间,总共五个子项 */
+        &:last-child {
+          margin-right: 0;
+        }
+      }
+    }
+  }
+}
+</style>

+ 157 - 0
zkqy-ui/src/views/amichi/dialogCompments/customizedVersion/processDisplay.vue

@@ -0,0 +1,157 @@
+<template>
+  <div class="app-container">
+    <div class="main-area">
+      <div class="show-header">
+        <div class="tag-list">
+          <div class="tag-item">
+             工序扫码记录
+          </div>
+        </div>
+        <div class="search-list">
+          <div class="search-tab">
+            <el-radio-group
+              v-model="queryParams.status"
+              @change="getList"
+            >
+              <el-radio-button label="2">已完成</el-radio-button>
+              <el-radio-button label="1">进行中</el-radio-button>
+              <el-radio-button label="">所有</el-radio-button>
+            </el-radio-group>
+          </div>
+          <div class="search-input">
+            <el-input
+              placeholder="请输入订单号..."
+              v-model="queryString"
+              @keyup.enter.native="getList"
+            >
+              <el-button
+                slot="append"
+                @click="getList"
+                icon="el-icon-search"
+              ></el-button>
+            </el-input>
+          </div>
+        </div>
+      </div>
+      <!--主体内容部分-->
+      <div class="show-body" v-loading="loading">
+        <template v-if="total > 0">
+          <TaskList v-for="(value, key,index) of tableData"
+                    :key="index + 1" :orderNumber="key"  :cardData="value"></TaskList>
+        </template>
+        <el-empty v-else description="暂无数据"></el-empty>
+        <!--分页列表-->
+        <pagination
+          v-show="total > 0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+        />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import TaskList from "./components/taskList.vue";
+import {scanCodeMonitoringLogs} from "@/api/amichi/ringScanInformation/index.js";
+
+export default {
+  name: "ProgressShow",
+  props: [],
+  components: { TaskList },
+  data() {
+    return {
+      queryString: "",
+      total: 0,
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        status: "1",
+      },
+      tableData: {}, //列表数据
+      loading: true,
+    };
+  },
+  computed: {},
+  methods: {
+    // 获取列表数据
+    getList() {
+      this.loading = true;
+      scanCodeMonitoringLogs({ ...this.queryParams, orderNumber: this.queryString })
+     .then(
+        res => {
+          if (res.code == 200) {
+            this.tableData=res.data;
+            this.total = res.total;
+          } else {
+            this.$message.error("网络异常,请稍后再试");
+          }
+          this.loading=false;
+        }
+      );
+    },
+  },
+  mounted() {
+    this.getList();
+  },
+  activated() {
+    this.getList();
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.app-container {
+  padding: 15px 15px;
+  box-sizing: border-box;
+  .main-area {
+    box-shadow: 0 1px 15px 1px rgb(69 65 78 / 8%);
+    background-color: #fff;
+    .show-header {
+      border-bottom: 1px solid #ebedf2;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 20px 0px 20px;
+      height: 50px;
+      .tag-list {
+        display: flex;
+        align-items: center;
+        .tag-item {
+          display: flex;
+          align-items: center;
+          margin-right: 15px;
+          font-size: 16px;
+          .circle {
+            width: 15px;
+            height: 15px;
+            background-color: rgb(104, 221, 104);
+            border-radius: 50%;
+            margin-right: 5px;
+          }
+          .icon {
+            margin-right: 5px;
+          }
+          .current-node {
+            display: inline-block;
+            border: 2px solid #34bfa3;
+            padding: 2px 5px;
+            margin: 2px 40px 2px 10px;
+          }
+        }
+      }
+      .search-list {
+        display: flex;
+        .search-tab {
+          margin-right: 20px;
+        }
+      }
+    }
+    .show-body {
+      padding: 25px;
+    }
+  }
+}
+</style>

+ 302 - 0
zkqy-ui/src/views/amichi/dialogCompments/processDisplay.vue

@@ -0,0 +1,302 @@
+<template>
+  <div class="app-container">
+    <div class="main-area">
+      <div class="show-header">
+        <div class="tag-list">
+          <div class="tag-item">
+             工序扫码记录
+          </div>
+        </div>
+        <div class="search-list">
+          <div class="search-tab">
+            <el-radio-group
+              v-model="queryParams.taskProcessState"
+              @change="getList"
+            >
+              <el-radio-button label="3">已完成</el-radio-button>
+              <el-radio-button label="0">进行中</el-radio-button>
+              <el-radio-button label="">所有</el-radio-button>
+            </el-radio-group>
+          </div>
+          <div class="search-input">
+            <el-input
+              placeholder="请输入订单号..."
+              v-model="queryString"
+              @keyup.enter.native="getList"
+            >
+              <el-button
+                slot="append"
+                @click="getList"
+                icon="el-icon-search"
+              ></el-button>
+            </el-input>
+          </div>
+        </div>
+      </div>
+      <div class="show-body" v-loading="loading">
+        <template v-if="tableData.length > 0">
+          <TaskList
+            v-for="(item, index) of tableData"
+            :key="index + 1"
+            :num="index + 1"
+            :cardData="item"
+          ></TaskList>
+        </template>
+        <el-empty v-else description="暂无数据"></el-empty>
+        <pagination
+          v-show="total > 0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+        />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import TaskList from "./components/taskList.vue";
+import { processList, getListLog,getListLogfjqy } from "@/api/bpmprocess/run/executeProcess";
+import getNodeSequence from "@/utils/bpmn/getNodeSequence";
+import { xmlStr2XmlObj } from "@/utils/bpmn/xml";
+
+export default {
+  name: "ProgressShow",
+  props: [],
+  components: { TaskList },
+  data() {
+    return {
+      // processType: 1,
+      queryString: "",
+      total: 0,
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        taskProcessState: "0",
+      },
+      tableData: [], //列表数据
+      loading: true,
+    };
+  },
+  computed: {},
+  methods: {
+    // 获取列表数据
+    getList() {
+      this.loading = true;
+      getListLogfjqy({ ...this.queryParams, taskName: this.queryString }).then(
+        (res) => {
+          if (res.code == 200) {
+            this.tableData = this.getTableData(
+              res.rows.map((item) => item.resultMap)
+            );
+            this.total = res.total;
+          } else {
+            this.$message.error("网络异常,请稍后再试");
+          }
+          this.loading=false;
+
+
+          return;
+          if (res.code == 200) {
+            this.tableData = this.getTableData(
+              res.rows.map((item) => item.resultMap)
+            );
+            this.total = res.total;
+          } else {
+            this.$message.error("网络异常,请稍后再试");
+          }
+        }
+      );
+    },
+    // 获取表格展示数据
+    getTableData(dataList) {
+      let res = [];
+      console.log(3333333);
+      res = dataList.map((item) => {
+        let baseObj = {
+          benTaskProcessKey: item.taskKey, //任务编号
+          bepTaskName: item.taskPlanName, //任务名称
+          bepTaskQuantity:item.quantity,//任务数量
+          benCreateTime: item.nodeLogList[0].taskNodeType
+            ? item.nodeLogList[0].createTime
+            : "", //开始或结束时间  需要根据bepTaskProcessState状态 来判定
+          currentNodeKey: item.taskNodeNextKey, //当前节点key
+          cardList: [],
+          doneNodeList: item.nodeLogList,
+          taskProcessState: item.taskProcessState,
+
+        };
+        let xmlObj = xmlStr2XmlObj(item.taskProcessXmlContent);
+        baseObj.cardList = getNodeSequence(xmlObj);
+        return baseObj;
+      });
+      res = this.nodeHandler(res); //合并两个节点数组
+      res = this.sortHandler(res); //排序
+      // res = this.setNodeState(res);
+      return res;
+    },
+    // 设置节点完成情况
+    setNodeState(res) {
+      res.forEach((re) => {
+        let nowKey = re.currentNodeKey;
+        let isDone = true;
+        re.cardList.forEach((item) => {
+          if (item.nodeId == nowKey) {
+            isDone = false;
+            item.isDone = isDone;
+            item.isNow = true;
+          } else {
+            item.isDone = isDone;
+            item.isNow = false;
+          }
+        });
+        // 当最后一个节点就是当前节点时置为完成状态
+        let lastNode = re.cardList[re.cardList.length - 1];
+        if (re.currentNodeKey == lastNode.nodeId) {
+          lastNode.isDone = true;
+          lastNode.isNow = false;
+        }
+      });
+
+      return res;
+    },
+
+    // 合并两个节点数组
+    nodeHandler(processList) {
+      let res = processList.map((item, index) => {
+        console.log(
+          JSON.parse(JSON.stringify(item.cardList)),
+          JSON.parse(JSON.stringify(item.doneNodeList)),
+          item.currentNodeKey
+        );
+        item.doneNodeList.forEach((node) => {
+          Object.assign(node, {
+            isDone: true,
+            isNow: false,
+            nodeId: node.taskNodeKey,
+            nodeInfo: {
+              localName: node.taskNodeType,
+              id: "",
+              name: node.taskNodeName,
+              nodeDescription: "",
+              industryType: "",
+              normalScriptKey: "",
+              normalScriptTriggerType: node.taskNodeExecuteType,
+              executeUserType: "",
+              virtuallyRole: "",
+              executeUser: node.createBy,
+              executeTime: node.createTime,
+            },
+          });
+        });
+        let currentIndex = item.cardList.findIndex(
+          (node) => node.nodeId == item.currentNodeKey
+        );
+        console.log(currentIndex, item.cardList.length);
+        // while(currentIndex<item.cardList.length){}
+        for (let i = currentIndex; i < item.cardList.length; i++) {
+          if (i == currentIndex) {
+            item.cardList[i].isNow = true;
+            if (i == item.cardList.length - 1) {
+              item.cardList[i].isDone = true;
+            } else {
+              item.cardList[i].isDone = false;
+            }
+          } else {
+            item.cardList[i].isDone = false;
+            item.cardList[i].isNow = false;
+          }
+        }
+        if (currentIndex == item.cardList.length - 1) {
+          item.cardList.splice(0, currentIndex + 1);
+        } else {
+          item.cardList.splice(0, currentIndex);
+        }
+        console.log(JSON.parse(JSON.stringify(item)));
+        if (item.taskProcessState == 3) {
+          item.cardList = item.doneNodeList;
+        } else {
+          item.cardList.unshift(...item.doneNodeList);
+        }
+
+        item.cardList.forEach((node, index) => {
+          node.num = index + 1;
+        });
+        return item;
+      });
+      return res;
+    },
+
+    // 任务排序
+    sortHandler(processList) {
+      processList.sort((a, b) => {
+        let time_a = new Date(a.doneNodeList[0].createTime)?.getTime();
+        let time_b = new Date(b.doneNodeList[0].createTime)?.getTime();
+        return time_b - time_a;
+      });
+      return processList;
+    },
+  },
+  mounted() {
+    this.getList();
+  },
+  activated() {
+    this.getList();
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.app-container {
+  padding: 15px 15px;
+  box-sizing: border-box;
+  .main-area {
+    box-shadow: 0 1px 15px 1px rgb(69 65 78 / 8%);
+    background-color: #fff;
+    .show-header {
+      border-bottom: 1px solid #ebedf2;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 20px 0px 20px;
+      height: 50px;
+      .tag-list {
+        display: flex;
+        align-items: center;
+        .tag-item {
+          display: flex;
+          align-items: center;
+          margin-right: 15px;
+          font-size: 16px;
+          .circle {
+            width: 15px;
+            height: 15px;
+            background-color: rgb(104, 221, 104);
+            border-radius: 50%;
+            margin-right: 5px;
+          }
+          .icon {
+            margin-right: 5px;
+          }
+          .current-node {
+            display: inline-block;
+            border: 2px solid #34bfa3;
+            padding: 2px 5px;
+            margin: 2px 40px 2px 10px;
+          }
+        }
+      }
+      .search-list {
+        display: flex;
+        .search-tab {
+          margin-right: 20px;
+        }
+      }
+    }
+    .show-body {
+      padding: 25px;
+    }
+  }
+}
+</style>

+ 288 - 0
zkqy-ui/src/views/amichi/handheldTerminal/terminal/index.vue

@@ -0,0 +1,288 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="终端编号" prop="handheldTerminalNumber">
+        <el-input
+          v-model="queryParams.handheldTerminalNumber"
+          placeholder="请输入终端编号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="终端名称" prop="handheldTerminalName">
+        <el-input
+          v-model="queryParams.handheldTerminalName"
+          placeholder="请输入终端名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['handheldTerminal:terminal:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['handheldTerminal:terminal:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['handheldTerminal:terminal:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['handheldTerminal:terminal:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table style="margin-top: 20px;" v-loading="loading" :data="terminalList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+<!--      <el-table-column label="主键" align="center" prop="id" />-->
+      <el-table-column label="终端编号" align="center" prop="handheldTerminalNumber" />
+      <el-table-column label="终端名称" align="center" prop="handheldTerminalName" />
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-dropdown @command="(command)=>{handleCommand(command, scope.row)}">
+            <el-button type="warning">
+              操作<i class="el-icon-arrow-down el-icon--right"></i>
+            </el-button>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item  icon="el-icon-edit"  command="handleUpdate">修改</el-dropdown-item>
+              <el-dropdown-item  icon="el-icon-delete" command="handleDelete">删除</el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改扫码扣料日志对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="终端编号" prop="handheldTerminalNumber">
+          <el-input v-model="form.handheldTerminalNumber" placeholder="请输入终端编号" />
+        </el-form-item>
+        <el-form-item label="终端名称" prop="handheldTerminalName">
+          <el-input v-model="form.handheldTerminalName" placeholder="请输入终端名称" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listTerminal, getTerminal, delTerminal, addTerminal, updateTerminal } from "@/api/amichi/handheldTerminal/terminal";
+
+export default {
+  name: "Terminal",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 扫码扣料日志表格数据
+      terminalList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        handheldTerminalNumber: null,
+        handheldTerminalName: null,
+        remarks: null,
+        createById: null,
+        updateById: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        handheldTerminalNumber: [
+          { required: true, message: "终端编号不能为空", trigger: "blur" }
+        ],
+        handheldTerminalName: [
+          { required: true, message: "终端名称不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询扫码扣料日志列表 */
+    getList() {
+      this.loading = true;
+      listTerminal(this.queryParams).then(response => {
+        this.terminalList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    //下拉菜单点击事件
+    handleCommand(command, row) {
+      switch (command) {
+        case "handleUpdate":
+          this.handleUpdate(row)
+          break;
+        case "handleDelete":
+          this.handleDelete(row)
+          break;
+        default:
+          break;
+      }
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        handheldTerminalNumber: null,
+        handheldTerminalName: null,
+        remarks: null,
+        createById: null,
+        createBy: null,
+        createTime: null,
+        updateById: null,
+        updateBy: null,
+        updateTime: null,
+        delFlag: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加扫码扣料日志";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getTerminal(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改扫码扣料日志";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateTerminal(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addTerminal(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除扫码扣料日志编号为"' + ids + '"的数据项?').then(function() {
+        return delTerminal(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('handheldTerminal/terminal/export', {
+        ...this.queryParams
+      }, `terminal_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 41 - 2
zkqy-ui/src/views/amichi/planTask/salesPlan.vue

@@ -117,6 +117,15 @@
               @click="pullPlan"
             >拉取流转卡生产计划</el-button>
           </el-col>
+          <el-col :span="1.5" v-show="queryParams.tabPosition==1">
+            <el-button
+              type="success"
+              plain
+              icon="el-icon-edit"
+              size="mini"
+              @click="dylzkdb"
+            >打印流转卡</el-button>
+          </el-col>
           <el-col :span="1.5" v-show="queryParams.tabPosition==2">
             <el-button
               type="primary"
@@ -146,7 +155,9 @@
         <el-table-column type="expand"  width="30">
           <template slot-scope="scopes">
             <el-table :data="scopes.row.planTaskDetails" border
+                      @selection-change="handleSelectionChangeTwo"
                       style="width:calc(100% - 80px);float:right" id="child_tab">
+              <el-table-column type="selection" align="center" width="55"></el-table-column>
               <el-table-column align="center"  label="需求单据" prop="demandDocument"/>
               <el-table-column align="center"  label="物料编码" prop="materialId" />
               <el-table-column align="center"  label="物料名称" prop="materialName"/>
@@ -250,7 +261,7 @@
                 <el-dropdown-item  icon="el-icon-edit"  command="handleUpdate">修改</el-dropdown-item>
                 <el-dropdown-item  icon="el-icon-delete"  command="handleDelete">删除</el-dropdown-item>
                 <el-dropdown-item  icon="el-icon-edit" v-if="scope.row.taskStatus==0" command="tc">投产</el-dropdown-item>
-                <el-dropdown-item  icon="el-icon-s-open"  v-if="scope.row.isWeldSheet==1" command="printFlowCard">打印流转卡</el-dropdown-item>
+<!--                <el-dropdown-item  icon="el-icon-s-open"  v-if="scope.row.isWeldSheet==1" command="printFlowCard">打印流转卡</el-dropdown-item>-->
                 <el-dropdown-item  icon="el-icon-s-open"  v-if="scope.row.isWeldSheet!=1" command="printWeldCard">打印流焊接单</el-dropdown-item>
               </el-dropdown-menu>
             </el-dropdown>
@@ -618,6 +629,7 @@ export default {
         pageSize: 10, // 每页大小
         ids:[]
       },
+      selectIds:[],
       qtTotal:0,
       selectionString:[],
       // 排序方式 默认降序
@@ -657,6 +669,22 @@ export default {
 
   },
   methods: {
+    dylzkdb(){
+      console.log("打印流转卡")
+      if(this.selectIds.length<=0){
+        console.log("请先勾选对应数据");
+        return;
+      }
+      console.log(this.selectIds)
+      //完整写法
+      //完整写法
+      this.$router.push({
+        path: '/amichi/print/FlowCardPrint',
+        query: {
+          "orderNumberSTwo": this.selectIds,
+        }
+      });
+    },
     formatDateTime(dateTimeString) {
       if (!dateTimeString) return '';
       const date = new Date(dateTimeString);
@@ -745,6 +773,17 @@ export default {
       this.single = selectionString.length!==1
       this.multiple = !selectionString.length
     },
+    // 多选框选中数据
+    handleSelectionChangeTwo(selectionString) {
+      console.log(selectionString);
+      this.selectIds= selectionString.map(item=>item.demandDocument)
+      console.log(this.selectIds)
+      // this.selectionString=selectionString
+      // this.ids = selectionString.map(item => item.id)
+      // this.selection=selectionString.map(item => item.id)
+      // this.single = selectionString.length!==1
+      // this.multiple = !selectionString.length
+    },
     // 自动排产确认回调
     autoConfirmHandler() {
       this.$refs.autoForm.validate(async (valid) => {
@@ -882,7 +921,7 @@ export default {
       this.$router.push({
         path: '/amichi/print/FlowCardPrint',
         query: {
-          "orderNumberS": this.orderNumebrs,
+          "orderNumberSTwo": this.selectIds,
         }
       });
     },

+ 175 - 132
zkqy-ui/src/views/amichi/print/FlowCardPrint.vue

@@ -37,92 +37,94 @@
                 </td>
               </tr>
               <tr>
-                <td style="width: 22%;">订单号:</td>
+                <td style="width: 22%;">订单号</td>
                 <td style="width: 28%;">{{item.orderNumber}}</td>
-                <td style="width: 20%;">产品编号:</td>
+                <td style="width: 20%;">产品编号</td>
                 <td style="width: 30%;">{{item.serialNumber}}</td>
               </tr>
               <tr>
-                <td>型号:</td>
+                <td>型号</td>
                 <td>{{item.model}}</td>
-                <td>功率:</td>
+                <td>功率</td>
                 <td>{{item.power}}</td>
               </tr>
               <tr>
                 <td>铁心长度</td>
                 <td>{{item.coreLength}}</td>
-                <td>电压频率:</td>
+                <td>电压频率</td>
                 <td>{{item.voltageFrequency}}</td>
               </tr>
               <tr>
-                <td>机壳/端盖:</td>
-                <td style="font-size: 24px">{{item.caseEndCover}}</td>
-                <td>盘片接口:</td>
+                <td>机壳/端盖</td>
+                <td style="font-size: 21px">{{item.caseEndCover}}</td>
+                <td>盘片接口</td>
                 <td>{{item.platterInterface}}</td>
               </tr>
               <tr>
-                <td>数据:</td>
+                <td>数据</td>
                 <td>{{item.dataInfo}}</td>
-                <td>开关箱:</td>
-                <td ref="detailsCells" style="font-size: 24px">{{item.switchBox}}</td>
+                <td>开关箱</td>
+                <td ref="detailsCells" style="font-size: 21px"><div ref="bzxsm" class="bzxsm" v-if="isDataLoaded">{{item.switchBox}}</div></td>
               </tr>
               <tr>
-                <td>颜色:</td>
-                <td ref="detailsCells" style="font-size: 24px">{{item.colour}}</td>
-                <td>铭牌:</td>
-                <td style="font-size: 24px" ref="detailsCells">{{item.mingPai}}</td>
+                <td>颜色</td>
+               <td ref="detailsCells" style="font-size: 21px;max-width:28%;"> <div ref="bzxsm" class="bzxsm" v-if="isDataLoaded">{{item.colour}}</div></td>
+                <td>铭牌</td>
+                <td style="font-size: 21px" ref="detailsCells">
+                  <div ref="bzxsm" class="bzxsm" v-if="isDataLoaded">{{item.mingPai}}</div>
+                </td>
               </tr>
               <tr>
-                <td>说明书:</td>
+                <td>说明书</td>
                 <td>{{item.specificationBook}}</td>
-                <td>合格证:</td>
+                <td>合格证</td>
                 <td>{{item.certificateOfConformity}}</td>
               </tr>
               <tr>
                 <td style="height: 70px;" >包装箱:</td>
-                <td  colspan="3"  id="content-cell" ref="detailsCells"  class="bs" style="font-size: 24px">
-                  {{item.packingBox}}
+                <td  colspan="3"  id="content-cell" ref="detailsCells"  class="bs" style="font-size: 21px">
+                  <div ref="bzx" class="bzx" v-if="isDataLoaded">{{item.packingBox}}  </div>
                 </td>
               </tr>
               <tr>
-                <td >特殊要求:</td>
-                <td ref="detailsCells"  colspan="3" id="content-cell" class="bs" style="font-size: 24px">
-                   {{item.specialRequirements}}
+                <td >特殊要求</td>
+                <td ref="detailsCells"  colspan="3" id="content-cell" class="bs" style="font-size: 21px">
+                     <div ref="bzx" class="bzx" > {{item.specialRequirements}}</div>
                 </td>
               </tr>
               <tr>
-                <td>焊接:</td>
+                <td>焊接</td>
                 <td></td>
-                <td>嵌线:</td>
+                <td>嵌线</td>
                 <td></td>
               </tr>
               <tr>
-                <td>整形:</td>
+                <td>整形</td>
                 <td></td>
-                <td>压端子:</td>
+                <td>压端子</td>
                 <td></td>
               </tr>
               <tr>
-                <td>白胚检验:</td>
+                <td>白胚检验</td>
                 <td></td>
-                <td>浸漆:</td>
+                <td>浸漆</td>
                 <td></td>
               </tr>
               <tr>
-                <td>总装:</td>
+                <td>总装</td>
                 <td></td>
-                <td>性能检验:</td>
+                <td>性能检验</td>
                 <td></td>
               </tr>
               <tr>
-                <td>包装:</td>
+                <td>包装</td>
                 <td></td>
-                <td>成品检验:</td>
+                <td>成品检验</td>
                 <td></td>
               </tr>
               <tr>
                 <td  class="bs">备注</td>
-                <td colspan="3" class="bs">{{item.remark}}</td>
+                <td colspan="3" class="bs"><div ref="bzx" class="bzx" v-if="isDataLoaded"> {{item.remark}}</div></td>
               </tr>
             </table>
           </div>
@@ -138,8 +140,7 @@
                       <span>序号1</span>
                     </div>
                     <div class="time">
-                      <span style="top: 79px;
-    left: 313px;">完成时间:<i>{{item.xqrq}}</i></span>
+                      <span style="top: 79px;left: 313px;">完成时间:<i>{{item.xqrq}}</i></span>
                     </div>
                   </div>
                 </td>
@@ -147,60 +148,60 @@
               <tr>
                 <td style="width: 20%;">订单号:</td>
                 <td>{{item.orderNumber}}</td>
-                <td>产品编号:</td>
+                <td>产品编号</td>
                 <td>{{item.serialNumber}}</td>
               </tr>
               <tr>
-                <td>型号:</td>
+                <td>型号</td>
                 <td>{{item.model}}</td>
-                <td>功率:</td>
+                <td>功率</td>
                 <td>{{item.power}}</td>
               </tr>
               <tr>
                 <td>铁心长度</td>
                 <td>{{item.coreLength}}</td>
-                <td>电压频率:</td>
+                <td>电压频率</td>
                 <td>{{item.voltageFrequency}}</td>
               </tr>
               <tr>
-                <td>数据:</td>
+                <td>数据</td>
                 <td>{{item.dataInfo}}</td>
-                <td>盘片接口:</td>
+                <td>盘片接口</td>
                 <td>{{item.platterInterface}}</td>
               </tr>
               <tr>
-                <td >特殊要求:</td>
-                <td colspan="3" id="content-cell" class="bs" style="font-size: 24px">
-                  {{item.specialRequirements}}
+                <td >特殊要求</td>
+                <td colspan="3" id="content-cell" class="bs" style="font-size: 21px">
+                  <div ref="bzx" class="bzx" v-if="isDataLoaded"> {{item.specialRequirements}}</div>
                 </td>
               </tr>
               <tr>
-                <td>焊接:</td>
+                <td>焊接</td>
                 <td></td>
                 <td></td>
                 <td></td>
               </tr>
               <tr>
-                <td>转子绑扎:</td>
+                <td>转子绑扎</td>
                 <td></td>
-                <td>白胚检验:</td>
+                <td>白胚检验</td>
                 <td></td>
               </tr>
               <tr>
-                <td>浸漆:</td>
+                <td>浸漆</td>
                 <td></td>
-                <td>转子压装:</td>
+                <td>转子压装</td>
                 <td></td>
               </tr>
               <tr>
-                <td>转子平衡:</td>
+                <td>转子平衡</td>
                 <td></td>
                 <td></td>
                 <td></td>
               </tr>
               <tr>
                 <td class="bs">备注</td>
-                <td colspan="3"  class="bs">{{item.remark}}</td>
+                <td colspan="3"  class="bs"><div ref="bzx" class="bzx" v-if="isDataLoaded"> {{item.remark}}</div></td>
               </tr>
             </table>
           </div>
@@ -217,99 +218,99 @@
                       <span>序号1</span>
                     </div>
                     <div class="time">
-                      <span style="top: 79px;
-    left: 313px;">完成时间:<i>{{item.xqrq}}</i></span>
+                      <span style="top: 79px;left: 313px;">完成时间:<i>{{item.xqrq}}</i></span>
                     </div>
                   </div>
                 </td>
               </tr>
               <tr>
-                <td style="width: 22%;">订单号:</td>
+                <td style="width: 22%;">订单号</td>
                 <td style="width: 28%;">  {{getNextOrderNumber(index).orderNumber}}</td>
-                <td style="width: 20%;">产品编号:</td>
+                <td style="width: 20%;">产品编号</td>
                 <td style="width: 30%;"> {{getNextOrderNumber(index).serialNumber}}  </td>
               </tr>
               <tr>
-                <td>型号:</td>
+                <td>型号</td>
                 <td > {{getNextOrderNumber(index).model}}  </td>
-                <td>功率:</td>
+                <td>功率</td>
                 <td > {{getNextOrderNumber(index).power}}  </td>
               </tr>
               <tr>
                 <td>铁心长度</td>
                 <td > {{getNextOrderNumber(index).coreLength}}  </td>
-                <td>电压频率:</td>
+                <td>电压频率</td>
                 <td > {{getNextOrderNumber(index).voltageFrequency}}  </td>
               </tr>
               <tr>
-                <td>机壳/端盖:</td>
-                <td style="font-size: 24px">{{getNextOrderNumber(index).caseEndCover}}</td>
-                <td>盘片接口:</td>
+                <td>机壳/端盖</td>
+                <td style="font-size: 21px">{{getNextOrderNumber(index).caseEndCover}}</td>
+                <td>盘片接口</td>
                 <td>{{getNextOrderNumber(index).platterInterface}}</td>
               </tr>
               <tr>
-                <td>数据:</td>
+                <td>数据</td>
                 <td>{{getNextOrderNumber(index).dataInfo}}</td>
-                <td>开关箱:</td>
-                <td style="font-size: 24px">{{getNextOrderNumber(index).switchBox}}</td>
+                <td>开关箱</td>
+                <td style="font-size: 21px"><div ref="bzxsm" class="bzxsm" v-if="isDataLoaded"> {{getNextOrderNumber(index).switchBox}}</div></td>
               </tr>
               <tr>
-                <td>颜色:</td>
-                <td style="font-size: 24px">  {{getNextOrderNumber(index).colour}} </td>
-                <td>铭牌:</td>
-                <td style="font-size: 24px">{{getNextOrderNumber(index).mingPai}}</td>
+                <td>颜色</td>
+                <td style="font-size: 21px">  {{getNextOrderNumber(index).colour}} </td>
+                <td>铭牌</td>
+                <td style="font-size: 21px"><div ref="bzxsm" class="bzxsm" v-if="isDataLoaded"> {{getNextOrderNumber(index).mingPai}}</div></td>
               </tr>
               <tr>
-                <td>说明书:</td>
+                <td>说明书</td>
                 <td>{{getNextOrderNumber(index).specificationBook}}</td>
-                <td>合格证:</td>
+                <td>合格证</td>
                 <td>{{getNextOrderNumber(index).certificateOfConformity}}</td>
               </tr>
               <tr>
-                <td >包装箱:</td>
-                <td colspan="3" id="content-cell" class="bs" style="font-size: 24px">
-                  {{getNextOrderNumber(index).packingBox}}
+                <td >包装箱</td>
+                <td colspan="3" id="content-cell" class="bs" style="font-size: 21px">
+                  <div ref="bzx" class="bzx" v-if="isDataLoaded"> {{getNextOrderNumber(index).packingBox}}
+                  </div>
                 </td>
               </tr>
               <tr>
-                <td >特殊要求:</td>
-                <td colspan="3" id="content-cell" class="bs" style="font-size: 24px">
-                  {{getNextOrderNumber(index).specialRequirements}}
+                <td >特殊要求</td>
+                <td colspan="3" id="content-cell" class="bs" style="font-size: 21px">
+                  <div ref="bzx" class="bzx" v-if="isDataLoaded">  {{getNextOrderNumber(index).specialRequirements}} </div>
                 </td>
               </tr>
               <tr>
-                <td>焊接:</td>
+                <td>焊接</td>
                 <td></td>
-                <td>嵌线:</td>
+                <td>嵌线</td>
                 <td></td>
               </tr>
               <tr>
-                <td>整形:</td>
+                <td>整形</td>
                 <td></td>
-                <td>压端子:</td>
+                <td>压端子</td>
                 <td></td>
               </tr>
               <tr>
-                <td>白胚检验:</td>
+                <td>白胚检验</td>
                 <td></td>
-                <td>浸漆:</td>
+                <td>浸漆</td>
                 <td></td>
               </tr>
               <tr>
-                <td>总装:</td>
+                <td>总装</td>
                 <td></td>
-                <td>性能检验:</td>
+                <td>性能检验</td>
                 <td></td>
               </tr>
               <tr>
-                <td>包装:</td>
+                <td>包装</td>
                 <td></td>
-                <td>成品检验:</td>
+                <td>成品检验</td>
                 <td></td>
               </tr>
               <tr>
                 <td class="bs" >备注</td>
-                <td colspan="3"class="bs">{{item.remark}}</td>
+                <td colspan="3"class="bs"><div ref="bzx" class="bzx" v-if="isDataLoaded"> {{item.remark}}</div></td>
               </tr>
             </table>
           </div  >
@@ -324,69 +325,68 @@
                       <span>序号1</span>
                     </div>
                     <div class="time">
-                      <span style="top: 79px;
-    left: 313px;">完成时间:<i>{{item.xqrq}}</i></span>
+                      <span style="top: 79px;left: 313px;">完成时间:<i>{{item.xqrq}}</i></span>
                     </div>
                   </div>
                 </td>
               </tr>
               <tr>
-                <td style="width: 22%;">订单号:</td>
+                <td style="width: 22%;">订单号</td>
                 <td style="width: 28%;">{{getNextOrderNumber(index).orderNumber}}</td>
-                <td style="width: 20%;">产品编号:</td>
+                <td style="width: 20%;">产品编号</td>
                 <td style="width: 30%;">{{getNextOrderNumber(index).serialNumber}}</td>
               </tr>
               <tr>
-                <td>型号:</td>
+                <td>型号</td>
                 <td>{{getNextOrderNumber(index).model}}</td>
-                <td>功率:</td>
+                <td>功率</td>
                 <td>{{getNextOrderNumber(index).power}}</td>
               </tr>
               <tr>
                 <td>铁心长度</td>
                 <td>{{getNextOrderNumber(index).coreLength}}</td>
-                <td>电压频率:</td>
+                <td>电压频率</td>
                 <td>{{getNextOrderNumber(index).voltageFrequency}}</td>
               </tr>
               <tr>
-                <td>数据:</td>
+                <td>数据</td>
                 <td>{{getNextOrderNumber(index).dataInfo}}</td>
-                <td>盘片接口:</td>
+                <td>盘片接口</td>
                 <td>{{getNextOrderNumber(index).platterInterface}}</td>
               </tr>
               <tr>
-                <td >特殊要求:</td>
-                <td colspan="3" id="content-cell" class="bs" style=" font-size: 24px">
-                  {{getNextOrderNumber(index).specialRequirements}}
+                <td >特殊要求</td>
+                <td colspan="3" id="content-cell" class="bs" style=" font-size: 21px">
+                  <div ref="bzx" class="bzx" v-if="isDataLoaded">  {{getNextOrderNumber(index).specialRequirements}}</div>
                 </td>
               </tr>
               <tr>
-                <td>焊接:</td>
+                <td>焊接</td>
                 <td></td>
                 <td></td>
                 <td></td>
               </tr>
               <tr>
-                <td>转子绑扎:</td>
+                <td>转子绑扎</td>
                 <td></td>
-                <td>白胚检验:</td>
+                <td>白胚检验</td>
                 <td></td>
               </tr>
               <tr>
-                <td>浸漆:</td>
+                <td>浸漆</td>
                 <td></td>
-                <td>转子压装:</td>
+                <td>转子压装</td>
                 <td></td>
               </tr>
               <tr>
-                <td>转子平衡:</td>
+                <td>转子平衡</td>
                 <td></td>
                 <td></td>
                 <td></td>
               </tr>
               <tr>
                 <td class="bs" >备注</td>
-                <td colspan="3" class="bs" >{{item.remark}}</td>
+                <td colspan="3" class="bs" ><div ref="bzx" class="bzx" v-if="isDataLoaded"> {{item.remark}}</div></td>
               </tr>
             </table>
           </div>
@@ -434,7 +434,8 @@ export default {
         //   }, 2000)
         // },
         standard: '',
-        extarCss: ''
+        extarCss: '',
+        isDataLoaded: false,
       }
     }
   },
@@ -446,42 +447,85 @@ export default {
         return 0
       }
     },
-    adjustFontSize() {
-      this.$nextTick(() => {
-        if (this.$refs.detailsCells) {
-          this.$refs.detailsCells.forEach(cell => {
-            console.log()
-            if (cell.scrollHeight > cell.clientHeight * 2) {
-              cell.style.fontSize = '10px';
-            } else {
-              cell.style.fontSize = ''; // 恢复默认字体大小
-            }
-          });
-        }
-      });
-    },
+
     //渲染表格内容
     async flowCardListApi(){
       let res = await flowCardList(this.queryParams)
       if (res.code == 200) {
         this.listDate = res.rows;
         this.total = res.total;
+        this.isDataLoaded = true;
+        this.$nextTick(()=>{
+          this.adjustFontSize();
+          this.adjustFontSizebzxsm()
+        })
+
+      }
+    },
+
+    adjustFontSize() {
+      const element = this.$refs.bzx;
+      if (!element) return; // 如果元素不存在,直接返回
+
+      for (let i=0;i<element.length;i++) {
+        const maxHeight = 115;
+        let currentFontSize = 21;
+        while (element[i].scrollHeight > maxHeight && currentFontSize > 8) {
+          currentFontSize -= 0.5; // 每次减少0.5px
+          element[i].style.fontSize = `${currentFontSize}px`;
+        }
       }
+      console.log(element[0].style)
     },
+    adjustFontSizebzxsm() {
+      const element = this.$refs.bzxsm;
+      console.log(element.length)
+      if (!element) return; // 如果元素不存在,直接返回
+      for (let i=0;i<element.length;i++){
+        const maxHeight = 50;
+        let currentFontSize = 21;
+        while (element[i].scrollHeight > maxHeight && currentFontSize > 8) {
+          currentFontSize -= 0.5; // 每次减少0.5px
+          element[i].style.fontSize = `${currentFontSize}px`;
+        }
+      }
+
+      console.log(element[0].style)
+    }
   },
   mounted() {
-    this.adjustFontSize();
+    // this.adjustFontSize();
   },
   created(){
-    console.log(this.$route.query.orderNumberS)
-    this.queryParams.orderNumberList =this.$route.query.orderNumberS;
-    console.log(this.queryParams.orderNumberList)
+    // console.log(this.$route.query.orderNumberS)
+    // this.queryParams.orderNumberList =this.$route.query.orderNumberS;
+    this.queryParams.orderNumberList =this.$route.query.orderNumberSTwo;
+    // console.log(this.queryParams.orderNumberList)
     this.flowCardListApi();
-  }
+  },
+
 }
+
 </script>
-<style media="print">
+<style media="print" scoped>
+.bzx{
+  width: 454px;
+  max-height: 115px;
+  overflow: hidden;
+  font-size: 21px;
+}
+.bs{
+  height: 115px;
+  min-height: 115px;
+}
+.bzxsm{
+  width: 180px;
+  max-height: 50px;
+  overflow: hidden;
+  font-size: 21px;
+}
 @media print {
+
   /* 隐藏页眉页脚 */
   @page {
     size: auto;
@@ -522,7 +566,7 @@ export default {
   padding: 0;
 }
 .box{
-  font-size: 25px;
+  font-size: 21px;
   width: 1250px;
   /* border: 1px solid red; */
   display: flex;
@@ -573,6 +617,7 @@ td{
   width: 80px;
   height: 80px;;
   background-color: red;
+  margin-top: 8px;
 }
 .titleBox{
   display: flex;
@@ -588,7 +633,7 @@ td{
 .left-top-table .titleBox .xh span{
   position: absolute;
   width: 80px;
-  left: -424px;
+  left: -421px;
   top: 80px;
 }
 .left-top-table .titleBox .time span{
@@ -624,9 +669,7 @@ td{
   left: -424px;
   top: 80px;
 }
-.bs{
-  height: 90px;
-}
+
 .right-top-table .titleBox .time span{
   position: absolute;
   left: 290px;

+ 1 - 1
zkqy-ui/src/views/amichi/print/FlowWeldCardPrint.vue

@@ -224,7 +224,7 @@ export default {
   }
 }
 </script>
-<style media="print">
+<style media="print" scoped>
 @media print {
   /* 隐藏页眉页脚 */
   @page {

+ 288 - 0
zkqy-ui/src/views/amichi/procedureList/list/index.vue

@@ -0,0 +1,288 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="工序编号" prop="procedureNumber">
+        <el-input
+          v-model="queryParams.procedureNumber"
+          placeholder="请输入工序编号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="工序名称" prop="procedurName">
+        <el-input
+          v-model="queryParams.procedurName"
+          placeholder="请输入工序名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['procedureList:list:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['procedureList:list:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['procedureList:list:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['procedureList:list:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table style="margin-top: 20px;" v-loading="loading" :data="listList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+<!--      <el-table-column label="主键" align="center" prop="id" />-->
+      <el-table-column label="工序编号" align="center" prop="procedureNumber" />
+      <el-table-column label="工序名称" align="center" prop="procedurName" />
+      <el-table-column label="备注" align="center" prop="remarks" />
+
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-dropdown @command="(command)=>{handleCommand(command, scope.row)}">
+            <el-button type="warning">
+              操作<i class="el-icon-arrow-down el-icon--right"></i>
+            </el-button>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item  icon="el-icon-edit"  command="handleUpdate">修改</el-dropdown-item>
+              <el-dropdown-item  icon="el-icon-delete" command="handleDelete">删除</el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改工序列表对话框 -->
+    <el-dialog  :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="工序编号" prop="procedureNumber">
+          <el-input v-model="form.procedureNumber" placeholder="请输入工序编号" />
+        </el-form-item>
+        <el-form-item label="工序名称" prop="procedurName">
+          <el-input v-model="form.procedurName" placeholder="请输入工序名称" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import { listList, getList, delList, addList, updateList } from "@/api/amichi/procedureList/list";
+export default {
+  name: "List",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 工序列表表格数据
+      listList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        procedureNumber: null,
+        procedurName: null,
+        remarks: null,
+        createById: null,
+        updateById: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        procedureNumber: [
+          { required: true, message: "工序编号不能为空", trigger: "blur" }
+        ],
+        procedurName: [
+          { required: true, message: "工序名称不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    //下拉菜单点击事件
+    handleCommand(command, row) {
+      switch (command) {
+        case "handleUpdate":
+          this.handleUpdate(row)
+          break;
+        case "handleDelete":
+          this.handleDelete(row)
+          break;
+        default:
+          break;
+      }
+    },
+    /** 查询工序列表列表 */
+    getList() {
+      this.loading = true;
+      listList(this.queryParams).then(response => {
+        this.listList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        procedureNumber: null,
+        procedurName: null,
+        remarks: null,
+        createById: null,
+        createBy: null,
+        createTime: null,
+        updateById: null,
+        updateBy: null,
+        updateTime: null,
+        delFlag: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加工序列表";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getList(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改工序列表";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateList(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addList(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除工序列表编号为"' + ids + '"的数据项?').then(function() {
+        return delList(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('procedureList/list/export', {
+        ...this.queryParams
+      }, `list_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 6 - 19
zkqy-ui/src/views/amichi/ringScanInformation/index.vue

@@ -1,18 +1,18 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="设备编号" prop="deviceNumber">
+      <el-form-item label="设备名称" prop="deviceNumber">
         <el-input
           v-model="queryParams.deviceNumber"
-          placeholder="请输入设备编号"
+          placeholder="请输入设备名称"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="设备名称" prop="deviceName">
+      <el-form-item label="设备编号" prop="deviceName">
         <el-input
           v-model="queryParams.deviceName"
-          placeholder="请输入设备名称"
+          placeholder="请输入设备编号"
           clearable
           @keyup.enter.native="handleQuery"
         />
@@ -88,8 +88,8 @@
     <el-table v-loading="loading" style="margin-top: 15px" :data="informationList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
 <!--      <el-table-column label="主键" align="center" prop="id" />-->
-      <el-table-column label="设备编号" align="center" prop="deviceNumber" />
-      <el-table-column label="设备名称" align="center" prop="deviceName" />
+      <el-table-column label="指环名称" align="center" prop="deviceNumber" />
+      <el-table-column label="指环编号" align="center" prop="deviceName" />
       <el-table-column label="扫描时间" align="center" prop="scanningTime" width="180">
 <!--        <template slot-scope="scope">-->
 <!--          <span>{{ parseTime(scope.row.scanningTime, '{y}-{m}-{d}') }}</span>-->
@@ -102,19 +102,6 @@
       <el-table-column label="物料编码" align="center" prop="materialCode" />
       <el-table-column label="物料名称" align="center" prop="materialName" />
       <el-table-column label="型号" align="center" prop="model" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-        <template slot-scope="scope">
-          <el-dropdown @command="(command)=>{handleCommand(command, scope.row)}">
-            <el-button type="warning">
-              操作<i class="el-icon-arrow-down el-icon--right"></i>
-            </el-button>
-            <el-dropdown-menu slot="dropdown">
-              <el-dropdown-item  icon="el-icon-edit"  command="handleUpdate">修改</el-dropdown-item>
-              <el-dropdown-item  icon="el-icon-delete" command="handleDelete">删除</el-dropdown-item>
-            </el-dropdown-menu>
-          </el-dropdown>
-        </template>
-      </el-table-column>
     </el-table>
 
     <pagination

+ 41 - 23
zkqy-ui/src/views/amichi/stationInformation/indexCopyV3.vue

@@ -1,14 +1,6 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="90px">
-      <!--      <el-form-item label="工位码信息" prop="stationCode">-->
-      <!--        <el-input-->
-      <!--          v-model="queryParams.stationCode"-->
-      <!--          placeholder="请输入工位码信息"-->
-      <!--          clearable-->
-      <!--          @keyup.enter.native="handleQuery"-->
-      <!--        />-->
-      <!--      </el-form-item>-->
       <el-form-item label="工位名称" prop="stationName">
         <el-input
           v-model="queryParams.stationName"
@@ -18,11 +10,9 @@
         />
       </el-form-item>
       <el-form-item label="工位类型" prop="stationType">
-        <el-select
-          v-model="queryParams.stationType"
-        >
+        <el-select v-model="queryParams.stationType">
           <el-option
-            v-for="(item,index) in dict.type.gxlxinfo"
+            v-for="(item,index) in processList"
             :key="index"
             :label="item.label"
             :value="item.value"
@@ -108,12 +98,14 @@
     <el-table v-loading="loading" :data="stationInformationList" @selection-change="handleSelectionChange" style="margin-top: 20px">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="工位名称" align="center" prop="stationName" />
-      <el-table-column label="人员姓名" align="center" prop="personnelName"/>
       <el-table-column label="工位类型"  align="center" prop="stationType">
         <template  v-slot="scope">
-          <dict-tag  :options="dict.type.gxlxinfo" :value="scope.row.stationType"/>
+           <span v-for="option in processList" :key="option.value" v-if="option.value == scope.row.stationType" class="custom-label">
+                   {{ option.label }}
+           </span>
         </template>
       </el-table-column>
+      <el-table-column label="人员姓名" align="center" prop="personnelName"/>
       <el-table-column label="设备名称" align="center" prop="deviceName" />
       <el-table-column label="备注" align="center" prop="remark" />
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
@@ -152,30 +144,31 @@
             style="width: 680px"
           >
             <el-option
-              v-for="(item,index) in dict.type.gxlxinfo"
+              v-for="(item,index) in processList"
               :key="index"
               :label="item.label"
               :value="item.value"
             ></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="人员姓名" prop="personnelName">
+        <el-form-item label="人员姓名" prop="personnelId">
           <el-select
-            v-model="form.personnelName"
+            v-model="form.personnelId"
             size="small"
             style="width: 680px"
+            @change="personnelNametSelected()"
           >
             <el-option
               v-for="(item,index) in userInfo"
               :key="index"
               :label="item.nickName"
-              :value="item.nickName"
+              :value="item.userId"
             ></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="设备名称" prop="deviceName">
-          <el-input v-model="form.deviceName" placeholder="请输入设备名称" />
-        </el-form-item>
+<!--        <el-form-item label="设备名称" prop="deviceName">-->
+<!--          <el-input v-model="form.deviceName" placeholder="请输入设备名称" />-->
+<!--        </el-form-item>-->
         <el-form-item label="备注" prop="remark">
           <el-input v-model="form.remark" placeholder="请输入备注" />
         </el-form-item>
@@ -194,11 +187,14 @@
 import { listStationInformation, getStationInformation, delStationInformation, addStationInformation, updateStationInformation } from "@/api/amichi/stationInformation/stationInformation";
 import qrCodeList from "@/views/amichi/print/qrCodeList";
 import {listUserInformation} from  "@/api/amichi/user/user"
+import {listList} from "@/api/amichi/procedureList/list";
 export default {
   name: "StationInformation",
   dicts:["gxlxinfo"],
   data() {
     return {
+      //工序列表
+      processList:[],
       // 遮罩层
       loading: true,
       // 选中数组
@@ -244,10 +240,15 @@ export default {
     };
   },
   created() {
-    this.getList();
+    this.processListApi();
     this.getListUserInformation();
+    this.getList();
   },
   methods: {
+    personnelNametSelected(){
+      let obj = this.userInfo.find(item=>item.userId==this.form.personnelId);
+      this.form.personnelName=obj.nickName;
+    },
     getListUserInformation(){
       listUserInformation().then(resp=>{
         this.userInfo=resp.rows.filter(item=>item.userName!="fjqyAdmin");
@@ -324,6 +325,19 @@ export default {
       };
       this.resetForm("form");
     },
+    /**
+     * 查询工序列表
+     */
+    processListApi(){
+      this.processList=[];
+      listList({"isEnablePaging":false}).then(response => {
+        let newData=response.rows.map(item=>{
+          return {"value":item.id,"label":item.procedurName}
+        })
+        this.processList=newData;
+        console.log(this.processList)
+      });
+    },
     /** 搜索按钮操作 */
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -342,8 +356,9 @@ export default {
     },
     /** 新增按钮操作 */
     handleAdd() {
-      this.getListUserInformation();
       this.reset();
+      this.getListUserInformation();
+      this.processListApi();
       this.open = true;
       this.title = "添加工位信息";
     },
@@ -351,9 +366,12 @@ export default {
     handleUpdate(row) {
       this.reset();
       this.getListUserInformation();
+      this.processListApi();
       const id = row.id || this.ids
       getStationInformation(id).then(response => {
         this.form = response.data;
+        this.form.personnelId=parseInt(response.data.personnelId);
+        this.form.stationType=parseInt(response.data.stationType);
         this.open = true;
         this.title = "修改工位信息";
       });

+ 429 - 0
zkqy-ui/src/views/amichi/system/dept/index.vue

@@ -0,0 +1,429 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+    >
+      <el-form-item label="部门名称" prop="deptName">
+        <el-input
+          v-model="queryParams.deptName"
+          placeholder="请输入部门名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select
+          v-model="queryParams.status"
+          placeholder="部门状态"
+          clearable
+        >
+          <el-option
+            v-for="dict in dict.type.sys_normal_disable"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="handleQuery"
+          >搜索
+        </el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+          >重置
+        </el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['system:dept:add']"
+          >新增
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="info"
+          plain
+          icon="el-icon-sort"
+          size="mini"
+          @click="toggleExpandAll"
+          >展开/折叠
+        </el-button>
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      v-if="refreshTable"
+      v-loading="loading"
+      :data="deptList"
+      style="margin-top: 20px"
+      row-key="deptId"
+      :default-expand-all="isExpandAll"
+      :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
+    >
+      <el-table-column prop="deptName"   align="center" label="部门名称"></el-table-column>
+      <el-table-column prop="leader"     align="center" label="部门领导"></el-table-column>
+      <el-table-column prop="orderNum"   align="center" label="排序"></el-table-column>
+      <el-table-column prop="status"     align="center" label="状态"  >
+        <template slot-scope="scope">
+          <dict-tag
+            :options="dict.type.sys_normal_disable"
+            :value="scope.row.status"
+          />
+        </template>
+      </el-table-column>
+      <el-table-column prop="createTime" align="center" label="创建时间"  >
+        <template v-slot="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template v-slot="scope">
+          <el-dropdown>
+            <el-button type="warning" plain size="small">
+              处理<i class="el-icon-arrow-down el-icon--right"></i>
+            </el-button>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-edit"
+                  @click="handleUpdate(scope.row)"
+                  v-hasPermi="['system:dept:edit']"
+                  >修改
+                </el-button>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-plus"
+                  @click="handleAdd(scope.row)"
+                  v-hasPermi="['system:dept:add']"
+                  >新增
+                </el-button>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="handleDelete(scope.row)"
+                  v-hasPermi="['system:dept:remove']"
+                  >删除
+                </el-button>
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 添加或修改部门对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-row>
+          <el-col :span="24" v-if="form.parentId !== 0">
+            <el-form-item label="上级部门" prop="parentId">
+              <treeselect
+                v-model="form.parentId"
+                :options="deptOptions"
+                :normalizer="normalizer"
+                placeholder="选择上级部门"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="部门名称" prop="deptName">
+              <el-input v-model="form.deptName" placeholder="请输入部门名称" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="显示排序" prop="orderNum">
+              <el-input-number
+                v-model="form.orderNum"
+                controls-position="right"
+                :min="0"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="负责人" prop="leader">
+              <el-input
+                v-model="form.leader"
+                placeholder="请输入负责人"
+                maxlength="20"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="联系电话" prop="phone">
+              <el-input
+                v-model="form.phone"
+                placeholder="请输入联系电话"
+                maxlength="11"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="邮箱" prop="email">
+              <el-input
+                v-model="form.email"
+                placeholder="请输入邮箱"
+                maxlength="50"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="部门状态">
+              <el-radio-group v-model="form.status">
+                <el-radio
+                  v-for="dict in dict.type.sys_normal_disable"
+                  :key="dict.value"
+                  :label="dict.value"
+                  >{{ dict.label }}
+                </el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listDept,
+  getDept,
+  delDept,
+  addDept,
+  updateDept,
+  listDeptExcludeChild,
+} from "@/api/system/dept";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "Dept",
+  dicts: ["sys_normal_disable"],
+  components: { Treeselect },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 表格树数据
+      deptList: [],
+      // 部门树选项
+      deptOptions: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 是否展开,默认全部展开
+      isExpandAll: true,
+      // 重新渲染表格状态
+      refreshTable: true,
+      // 查询参数
+      queryParams: {
+        deptName: undefined,
+        status: undefined,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        // parentId: [
+        //   { required: true, message: "上级部门不能为空", trigger: "blur" },
+        // ],
+        deptName: [
+          { required: true, message: "部门名称不能为空", trigger: "blur" },
+        ],
+        orderNum: [
+          { required: true, message: "显示排序不能为空", trigger: "blur" },
+        ],
+        email: [
+          {
+            type: "email",
+            message: "请输入正确的邮箱地址",
+            trigger: ["blur", "change"],
+          },
+        ],
+        phone: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "请输入正确的手机号码",
+            trigger: "blur",
+          },
+        ],
+      },
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询部门列表 */
+    getList() {
+      this.loading = true;
+      listDept(this.queryParams).then((response) => {
+        this.deptList = this.handleTree(response.data, "deptId");
+        this.loading = false;
+      });
+    },
+    /** 转换部门数据结构 */
+    normalizer(node) {
+      if (node.children && !node.children.length) {
+        delete node.children;
+      }
+      return {
+        id: node.deptId,
+        label: node.deptName,
+        children: node.children,
+      };
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        deptId: undefined,
+        parentId: undefined,
+        deptName: undefined,
+        orderNum: undefined,
+        leader: undefined,
+        phone: undefined,
+        email: undefined,
+        status: "0",
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd(row) {
+      this.reset();
+      if (row != undefined) {
+        this.form.parentId = row.deptId;
+      }
+      this.open = true;
+      this.title = "添加部门";
+      listDept().then((response) => {
+        this.deptOptions = this.handleTree(response.data, "deptId");
+      });
+    },
+    /** 展开/折叠操作 */
+    toggleExpandAll() {
+      this.refreshTable = false;
+      this.isExpandAll = !this.isExpandAll;
+      this.$nextTick(() => {
+        this.refreshTable = true;
+      });
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      getDept(row.deptId).then((response) => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改部门";
+        listDeptExcludeChild(row.deptId).then((response) => {
+          this.deptOptions = this.handleTree(response.data, "deptId");
+          if (this.deptOptions.length == 0) {
+            const noResultsOptions = {
+              deptId: this.form.parentId,
+              deptName: this.form.parentName,
+              children: [],
+            };
+            this.deptOptions.push(noResultsOptions);
+          }
+        });
+      });
+    },
+    /** 提交按钮 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.deptId != undefined) {
+            this.form["tenantId"] = this.$store.state.user.tenant.tenantId;
+            updateDept(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            if (typeof this.form.parentId == "undefined") {
+              this.form.parentId = 0;
+            }
+            this.form["tenantId"] = this.$store.state.user.tenant.tenantId;
+            addDept(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      if (row.children?.length) {
+        this.$message.error("当前部门存在子部门,不可删除!请先删除子部门");
+        return;
+      }
+      this.$modal
+        .confirm('是否确认删除名称为"' + row.deptName + '"的数据项?')
+        .then(function () {
+          return delDept(row.deptId);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+  },
+};
+</script>

+ 576 - 0
zkqy-ui/src/views/amichi/system/menu/index.vue

@@ -0,0 +1,576 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+    >
+      <el-form-item label="菜单名称" prop="menuName">
+        <el-input
+          v-model="queryParams.menuName"
+          placeholder="请输入菜单名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <!-- <el-form-item label="租户名称" prop="tenantName">
+        <el-input
+          v-model="queryParams.tenantName"
+          placeholder="请输入租户名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item> -->
+      <el-form-item label="状态" prop="status">
+        <el-select
+          v-model="queryParams.status"
+          placeholder="菜单状态"
+          clearable
+        >
+          <el-option
+            v-for="dict in dict.type.sys_normal_disable"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+          >重置</el-button
+        >
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['system:menu:add']">新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="info" plain icon="el-icon-sort" size="mini" @click="toggleExpandAll">展开/折叠</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table
+      v-if="refreshTable"
+      v-loading="loading"
+      :data="menuList"
+      row-key="menuId"
+      style="margin-top: 20px"
+      :default-expand-all="isExpandAll"
+      :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
+    >
+      <el-table-column prop="menuName" align="center" label="菜单名称" :show-overflow-tooltip="true"></el-table-column>
+      <el-table-column prop="icon" label="图标" align="center" >
+        <template v-slot="scope">
+          <svg-icon :icon-class="scope.row.icon" />
+        </template>
+      </el-table-column>
+      <el-table-column prop="orderNum" label="排序" align="center"></el-table-column>
+      <el-table-column prop="perms" label="权限标识" align="center" :show-overflow-tooltip="true"></el-table-column>
+      <el-table-column prop="component" label="组件路径" align="center" :show-overflow-tooltip="true"></el-table-column>
+      <el-table-column prop="status" label="状态" align="center">
+        <template v-slot="scope">
+          <dict-tag
+            :options="dict.type.sys_normal_disable"
+            :value="scope.row.status"
+          />
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime">
+        <template v-slot="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template v-slot="scope">
+          <el-dropdown>
+            <el-button type="warning" plain size="small">
+              处理<i class="el-icon-arrow-down el-icon--right"></i>
+            </el-button>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item
+                ><el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-edit"
+                  @click="handleUpdate(scope.row)"
+                  v-hasPermi="['system:menu:edit']"
+                  >修改</el-button
+                ></el-dropdown-item
+              >
+              <el-dropdown-item
+                ><el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-plus"
+                  @click="handleAdd(scope.row)"
+                  v-hasPermi="['system:menu:add']"
+                  >新增</el-button
+                ></el-dropdown-item
+              >
+              <el-dropdown-item
+                ><el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="handleDelete(scope.row)"
+                  v-hasPermi="['system:menu:remove']"
+                  >删除</el-button
+                ></el-dropdown-item
+              >
+            </el-dropdown-menu>
+          </el-dropdown>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 添加或修改菜单对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="680px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="上级菜单" prop="parentId">
+              <treeselect
+                v-model="form.parentId"
+                :options="menuOptions"
+                :normalizer="normalizer"
+                :show-count="true"
+                placeholder="选择上级菜单"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="菜单类型" prop="menuType">
+              <el-radio-group v-model="form.menuType">
+                <el-radio label="M">目录</el-radio>
+                <el-radio label="C">菜单</el-radio>
+                <el-radio label="F">按钮</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24" v-if="form.menuType != 'F'">
+            <el-form-item label="菜单图标" prop="icon">
+              <el-popover
+                placement="bottom-start"
+                width="460"
+                trigger="click"
+                @show="$refs['iconSelect'].reset()"
+              >
+                <IconSelect
+                  ref="iconSelect"
+                  @selected="selected"
+                  :active-icon="form.icon"
+                />
+                <el-input
+                  slot="reference"
+                  v-model="form.icon"
+                  placeholder="点击选择图标"
+                  readonly
+                >
+                  <svg-icon
+                    v-if="form.icon"
+                    slot="prefix"
+                    :icon-class="form.icon"
+                    style="width: 25px"
+                  />
+                  <i
+                    v-else
+                    slot="prefix"
+                    class="el-icon-search el-input__icon"
+                  />
+                </el-input>
+              </el-popover>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="菜单名称" prop="menuName">
+              <el-input v-model="form.menuName" placeholder="请输入菜单名称" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="显示排序" prop="orderNum">
+              <el-input-number
+                v-model="form.orderNum"
+                controls-position="right"
+                :min="0"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12" v-if="form.menuType != 'F'">
+            <el-form-item prop="isFrame">
+              <span slot="label">
+                <el-tooltip
+                  content="选择是外链则路由地址需要以`http(s)://`开头"
+                  placement="top"
+                >
+                  <i class="el-icon-question"></i>
+                </el-tooltip>
+                是否外链
+              </span>
+              <el-radio-group v-model="form.isFrame">
+                <el-radio label="0">是</el-radio>
+                <el-radio label="1">否</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12" v-if="form.menuType != 'F'">
+            <el-form-item prop="path">
+              <span slot="label">
+                <el-tooltip
+                  content="访问的路由地址,如:`user`,如外网地址需内链访问则以`http(s)://`开头"
+                  placement="top"
+                >
+                  <i class="el-icon-question"></i>
+                </el-tooltip>
+                路由地址
+              </span>
+              <el-input v-model="form.path" placeholder="请输入路由地址" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12" v-if="form.menuType == 'C'">
+            <el-form-item prop="component">
+              <span slot="label">
+                <el-tooltip
+                  content="访问的组件路径,如:`system/user/index`,默认在`views`目录下"
+                  placement="top"
+                >
+                  <i class="el-icon-question"></i>
+                </el-tooltip>
+                组件路径
+              </span>
+              <el-input v-model="form.component" placeholder="请输入组件路径" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12" v-if="form.menuType != 'M'">
+            <el-form-item prop="perms">
+              <el-input
+                v-model="form.perms"
+                placeholder="请输入权限标识"
+                maxlength="100"
+              />
+              <span slot="label">
+                <el-tooltip
+                  content="控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasPermi('system:user:list')`)"
+                  placement="top"
+                >
+                  <i class="el-icon-question"></i>
+                </el-tooltip>
+                权限字符
+              </span>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12" v-if="form.menuType == 'C'">
+            <el-form-item prop="query">
+              <el-input
+                v-model="form.query"
+                placeholder="请输入路由参数"
+                maxlength="255"
+              />
+              <span slot="label">
+                <el-tooltip
+                  content='访问路由的默认传递参数,如:`{"id": 1, "name": "ry"}`'
+                  placement="top"
+                >
+                  <i class="el-icon-question"></i>
+                </el-tooltip>
+                路由参数
+              </span>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12" v-if="form.menuType == 'C'">
+            <el-form-item prop="isCache">
+              <span slot="label">
+                <el-tooltip
+                  content="选择是则会被`keep-alive`缓存,需要匹配组件的`name`和地址保持一致"
+                  placement="top"
+                >
+                  <i class="el-icon-question"></i>
+                </el-tooltip>
+                是否缓存
+              </span>
+              <el-radio-group v-model="form.isCache">
+                <el-radio label="0">缓存</el-radio>
+                <el-radio label="1">不缓存</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12" v-if="form.menuType != 'F'">
+            <el-form-item prop="visible">
+              <span slot="label">
+                <el-tooltip
+                  content="选择隐藏则路由将不会出现在侧边栏,但仍然可以访问"
+                  placement="top"
+                >
+                  <i class="el-icon-question"></i>
+                </el-tooltip>
+                显示状态
+              </span>
+              <el-radio-group v-model="form.visible">
+                <el-radio
+                  v-for="dict in dict.type.sys_show_hide"
+                  :key="dict.value"
+                  :label="dict.value"
+                  >{{ dict.label }}</el-radio
+                >
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12" v-if="form.menuType != 'F'">
+            <el-form-item prop="status">
+              <span slot="label">
+                <el-tooltip
+                  content="选择停用则路由将不会出现在侧边栏,也不能被访问"
+                  placement="top"
+                >
+                  <i class="el-icon-question"></i>
+                </el-tooltip>
+                菜单状态
+              </span>
+              <el-radio-group v-model="form.status">
+                <el-radio
+                  v-for="dict in dict.type.sys_normal_disable"
+                  :key="dict.value"
+                  :label="dict.value"
+                  >{{ dict.label }}</el-radio
+                >
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listMenu,
+  getMenu,
+  delMenu,
+  addMenu,
+  updateMenu,
+} from "@/api/system/menu";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import IconSelect from "@/components/IconSelect";
+
+export default {
+  name: "Menu",
+  dicts: ["sys_show_hide", "sys_normal_disable"],
+  components: { Treeselect, IconSelect },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 菜单表格树数据
+      menuList: [],
+      // 菜单树选项
+      menuOptions: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 是否展开,默认全部折叠
+      isExpandAll: false,
+      // 重新渲染表格状态
+      refreshTable: true,
+      // 查询参数
+      queryParams: {
+        menuName: undefined,
+        tenantName: undefined,
+        visible: undefined,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        menuName: [
+          { required: true, message: "菜单名称不能为空", trigger: "blur" },
+        ],
+        orderNum: [
+          { required: true, message: "菜单顺序不能为空", trigger: "blur" },
+        ],
+        path: [
+          { required: true, message: "路由地址不能为空", trigger: "blur" },
+        ],
+      },
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    // 选择图标
+    selected(name) {
+      this.form.icon = name;
+    },
+    /** 查询菜单列表 */
+    getList() {
+      this.loading = true;
+      listMenu(this.queryParams).then((response) => {
+        this.menuList = this.handleTree(response.data, "menuId");
+        this.loading = false;
+      });
+    },
+    /** 转换菜单数据结构 */
+    normalizer(node) {
+      if (node.children && !node.children.length) {
+        delete node.children;
+      }
+      return {
+        id: node.menuId,
+        label: node.menuName,
+        children: node.children,
+      };
+    },
+    /** 查询菜单下拉树结构 */
+    getTreeselect() {
+      listMenu().then((response) => {
+        this.menuOptions = [];
+        const menu = { menuId: 0, menuName: "主类目", children: [] };
+        menu.children = this.handleTree(response.data, "menuId");
+        this.menuOptions.push(menu);
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        menuId: undefined,
+        parentId: 0,
+        menuName: undefined,
+        icon: undefined,
+        menuType: "M",
+        orderNum: undefined,
+        isFrame: "1",
+        isCache: "0",
+        visible: "0",
+        status: "0",
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd(row) {
+      this.reset();
+      this.getTreeselect();
+      if (row != null && row.menuId) {
+        this.form.parentId = row.menuId;
+      } else {
+        this.form.parentId = 0;
+      }
+      this.open = true;
+      this.title = "添加菜单";
+    },
+    /** 展开/折叠操作 */
+    toggleExpandAll() {
+      this.refreshTable = false;
+      this.isExpandAll = !this.isExpandAll;
+      this.$nextTick(() => {
+        this.refreshTable = true;
+      });
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      this.getTreeselect();
+      getMenu(row.menuId).then((response) => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改菜单";
+      });
+    },
+    /** 提交按钮 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.menuId != undefined) {
+            this.form["tenantId"] = this.$store.state.user.tenant.tenantId;
+            updateMenu(this.form).then((response) => {
+              if (response.code == 200) {
+                this.$modal.msgSuccess("修改成功");
+                this.open = false;
+                this.getList();
+                this.reloadRouter();
+              } else {
+                this.$modal.msgError("修改失败");
+              }
+            });
+          } else {
+            this.form["tenantId"] = this.$store.state.user.tenant.tenantId;
+            addMenu(this.form).then((response) => {
+              if (response.code == 200) {
+                this.$modal.msgSuccess("新增成功");
+                this.open = false;
+                this.getList();
+                this.reloadRouter();
+              } else {
+                this.$modal.msgError("新增失败");
+              }
+            });
+          }
+        }
+      });
+    },
+    // 更新路由
+    reloadRouter() {
+      this.$store.dispatch("GenerateRoutes").then((accessRoutes) => {
+        this.$router.addRoutes(accessRoutes); // 动态添加可访问路由表
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      this.$modal
+        .confirm('是否确认删除名称为"' + row.menuName + '"的数据项?')
+        .then(function () {
+          return delMenu(row.menuId);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+  },
+};
+</script>
+<style scoped lang="scss" scoped>
+/* #app .sidebar-container .submenu-title-noDropdown:hover, #app .sidebar-container .el-submenu__title:hover {
+    background-color: rgba(0, 0, 0, 0.06) !important;
+}  */
+.submenu-title-noDropdown:hover {
+  background-color: linear-gradient(to right, blue, rgb(69, 118, 225));
+}
+</style>

+ 754 - 0
zkqy-ui/src/views/amichi/system/role/index.vue

@@ -0,0 +1,754 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+    >
+      <el-form-item label="角色名称" prop="roleName">
+        <el-input
+          v-model="queryParams.roleName"
+          placeholder="请输入角色名称"
+          clearable
+          style="width: 240px"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="权限字符" prop="roleKey">
+        <el-input
+          v-model="queryParams.roleKey"
+          placeholder="请输入权限字符"
+          clearable
+          style="width: 240px"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select
+          v-model="queryParams.status"
+          placeholder="角色状态"
+          clearable
+          style="width: 240px"
+        >
+          <el-option
+            v-for="dict in dict.type.sys_normal_disable"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="创建时间">
+        <el-date-picker
+          v-model="dateRange"
+          style="width: 240px"
+          value-format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+          >重置</el-button
+        >
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['system:role:add']"
+          >新增</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['system:role:remove']"
+          >删除</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-if="selection.length == 0"
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['system:role:export']"
+          >导出</el-button
+        >
+        <ExcelDownLoad
+          v-else
+          :headerList="headerList"
+          :fieldList="selection"
+          :excelTitle="excelTitle"
+        ></ExcelDownLoad>
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      v-loading="loading"
+      :data="roleList"
+      style="margin-top: 20px"
+      ref="tableRef"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="角色编号" prop="roleId" align="center" />
+      <el-table-column label="角色名称" prop="roleName" :show-overflow-tooltip="true" align="center"/>
+      <el-table-column label="租户名称" prop="tenantName" v-if="$store.state.user.name == 'admin'" :show-overflow-tooltip="true" align="center"/>
+      <el-table-column label="权限字符" prop="roleKey" :show-overflow-tooltip="true" align="center"/>
+      <el-table-column label="显示顺序" prop="roleSort" align="center" />
+      <el-table-column label="状态" align="center" >
+        <template slot-scope="scope">
+          <el-switch
+            v-model="scope.row.status"
+            active-value="0"
+            inactive-value="1"
+            @change="handleStatusChange(scope.row)"
+          ></el-switch>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope" v-if="scope.row.roleId !== 1">
+          <el-dropdown>
+            <el-button type="warning" plain size="small">
+              处理<i class="el-icon-arrow-down el-icon--right"></i>
+            </el-button>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item
+                ><el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-edit"
+                  @click="handleUpdate(scope.row)"
+                  v-hasPermi="['system:tenant:edit']"
+                  >修改</el-button
+                ></el-dropdown-item
+              >
+              <el-dropdown-item
+                ><el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="handleDelete(scope.row)"
+                  v-hasPermi="['system:tenant:remove']"
+                  >删除</el-button
+                > </el-dropdown-item
+              ><el-dropdown-item>
+                <el-dropdown
+                  size="mini"
+                  @command="(command) => handleCommand(command, scope.row)"
+                  v-hasPermi="['system:role:edit']"
+                >
+                  <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-d-arrow-right"
+                    >更多</el-button
+                  >
+                  <el-dropdown-menu slot="dropdown">
+                    <el-dropdown-item
+                      command="handleDataScope"
+                      icon="el-icon-circle-check"
+                      v-hasPermi="['system:role:edit']"
+                      >数据权限</el-dropdown-item
+                    >
+                    <el-dropdown-item
+                      command="handleAuthUser"
+                      icon="el-icon-user"
+                      v-hasPermi="['system:role:edit']"
+                      >分配用户</el-dropdown-item
+                    >
+                  </el-dropdown-menu>
+                </el-dropdown>
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination v-show="total > 0"
+                :total="total"
+                :page.sync="queryParams.pageNum"
+                :limit.sync="queryParams.pageSize"
+                @pagination="getList"/>
+
+    <!-- 添加或修改角色配置对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="角色名称" prop="roleName">
+          <el-input v-model="form.roleName" placeholder="请输入角色名称" />
+        </el-form-item>
+        <el-form-item prop="roleKey">
+          <span slot="label">
+            <el-tooltip
+              content="控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasRole('admin')`)"
+              placement="top"
+            >
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+            权限字符
+          </span>
+          <el-input v-model="form.roleKey" placeholder="请输入权限字符" />
+        </el-form-item>
+        <el-form-item label="角色顺序" prop="roleSort">
+          <el-input-number
+            v-model="form.roleSort"
+            controls-position="right"
+            :min="0"
+          />
+        </el-form-item>
+        <el-form-item label="状态">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.sys_normal_disable"
+              :key="dict.value"
+              :label="dict.value"
+              >{{ dict.label }}</el-radio
+            >
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="菜单权限">
+          <el-checkbox
+            v-model="menuExpand"
+            @change="handleCheckedTreeExpand($event, 'menu')"
+            >展开/折叠</el-checkbox
+          >
+          <el-checkbox
+            v-model="menuNodeAll"
+            @change="handleCheckedTreeNodeAll($event, 'menu')"
+            >全选/全不选</el-checkbox
+          >
+          <el-checkbox
+            v-model="form.menuCheckStrictly"
+            @change="handleCheckedTreeConnect($event, 'menu')"
+            >父子联动</el-checkbox
+          >
+          <el-tree
+            class="tree-border"
+            :data="menuOptions"
+            show-checkbox
+            ref="menu"
+            node-key="id"
+            :check-strictly="!form.menuCheckStrictly"
+            empty-text="加载中,请稍候"
+            :props="defaultProps"
+          ></el-tree>
+        </el-form-item>
+        <el-form-item label="备注">
+          <el-input
+            v-model="form.remark"
+            type="textarea"
+            placeholder="请输入内容"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 分配角色数据权限对话框 -->
+    <el-dialog
+      :title="title"
+      :visible.sync="openDataScope"
+      width="500px"
+      append-to-body
+    >
+      <el-form :model="form" label-width="80px">
+        <el-form-item label="角色名称">
+          <el-input v-model="form.roleName" :disabled="true" />
+        </el-form-item>
+        <el-form-item label="权限字符">
+          <el-input v-model="form.roleKey" :disabled="true" />
+        </el-form-item>
+        <el-form-item label="权限范围">
+          <el-select v-model="form.dataScope" @change="dataScopeSelectChange">
+            <el-option
+              v-for="item in dataScopeOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="数据权限" v-show="form.dataScope == 2">
+          <el-checkbox
+            v-model="deptExpand"
+            @change="handleCheckedTreeExpand($event, 'dept')"
+            >展开/折叠</el-checkbox
+          >
+          <el-checkbox
+            v-model="deptNodeAll"
+            @change="handleCheckedTreeNodeAll($event, 'dept')"
+            >全选/全不选</el-checkbox
+          >
+          <el-checkbox
+            v-model="form.deptCheckStrictly"
+            @change="handleCheckedTreeConnect($event, 'dept')"
+            >父子联动</el-checkbox
+          >
+          <el-tree
+            class="tree-border"
+            :data="deptOptions"
+            show-checkbox
+            default-expand-all
+            ref="dept"
+            node-key="id"
+            :check-strictly="!form.deptCheckStrictly"
+            empty-text="加载中,请稍候"
+            :props="defaultProps"
+          ></el-tree>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitDataScope">确 定</el-button>
+        <el-button @click="cancelDataScope">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listRole,
+  getRole,
+  delRole,
+  addRole,
+  updateRole,
+  dataScope,
+  changeRoleStatus,
+  deptTreeSelect,
+} from "@/api/system/role";
+import {
+  treeselect as menuTreeselect,
+  roleMenuTreeselect,
+} from "@/api/system/menu";
+import ExcelDownLoad from "@/components/ExcelDownLoad/index.vue";
+
+export default {
+  name: "Role",
+  dicts: ["sys_normal_disable"],
+  components: {
+    ExcelDownLoad,
+  },
+  data() {
+    return {
+      // 前端导出数据
+      excelTitle: "role",
+      headerList: {
+        角色序号: "roleId",
+        角色名称: "roleName",
+        角色权限: "roleKey",
+        角色排序: "roleSort",
+        数据范围: "dataScope",
+        角色状态: "status",
+      },
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 选中数组(包含所有数据)
+      selection: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 角色表格数据
+      roleList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 是否显示弹出层(数据权限)
+      openDataScope: false,
+      menuExpand: false,
+      menuNodeAll: false,
+      deptExpand: true,
+      deptNodeAll: false,
+      // 日期范围
+      dateRange: [],
+      // 数据范围选项
+      dataScopeOptions: [
+        {
+          value: "1",
+          label: "全部数据权限",
+        },
+        {
+          value: "2",
+          label: "自定数据权限",
+        },
+        {
+          value: "3",
+          label: "本部门数据权限",
+        },
+        {
+          value: "4",
+          label: "本部门及以下数据权限",
+        },
+        {
+          value: "5",
+          label: "仅本人数据权限",
+        },
+      ],
+      // 菜单列表
+      menuOptions: [],
+      // 部门列表
+      deptOptions: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        roleName: undefined,
+        roleKey: undefined,
+        status: undefined,
+        tenantName: undefined,
+      },
+      // 表单参数
+      form: {},
+      defaultProps: {
+        children: "children",
+        label: "label",
+      },
+      // 表单校验
+      rules: {
+        roleName: [
+          { required: true, message: "角色名称不能为空", trigger: "blur" },
+        ],
+        roleKey: [
+          { required: true, message: "权限字符不能为空", trigger: "blur" },
+        ],
+        roleSort: [
+          { required: true, message: "角色顺序不能为空", trigger: "blur" },
+        ],
+      },
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询角色列表 */
+    getList() {
+      this.loading = true;
+      let tempSelection = JSON.parse(JSON.stringify(this.selection));
+      listRole(this.addDateRange(this.queryParams, this.dateRange)).then(
+        (response) => {
+          response.rows = response.rows.filter(
+            (item) => !tempSelection.find((val) => val.roleId == item.roleId)
+          );
+          // this.roleList = [...tempSelection, ...response.rows];
+          this.roleList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+          // if (tempSelection.length) {
+          //   this.$nextTick(() => {
+          //     tempSelection.forEach((item) => {
+          //       this.$refs.tableRef.toggleRowSelection(item);
+          //     });
+          //   });
+          // }
+        }
+      );
+    },
+    /** 查询菜单树结构 */
+    getMenuTreeselect() {
+      menuTreeselect().then((response) => {
+        this.menuOptions = response.data;
+      });
+    },
+    // 所有菜单节点数据
+    getMenuAllCheckedKeys() {
+      // 目前被选中的菜单节点
+      let checkedKeys = this.$refs.menu.getCheckedKeys();
+      // 半选中的菜单节点
+      let halfCheckedKeys = this.$refs.menu.getHalfCheckedKeys();
+      checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
+      return checkedKeys;
+    },
+    // 所有部门节点数据
+    getDeptAllCheckedKeys() {
+      // 目前被选中的部门节点
+      let checkedKeys = this.$refs.dept.getCheckedKeys();
+      // 半选中的部门节点
+      let halfCheckedKeys = this.$refs.dept.getHalfCheckedKeys();
+      checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
+      return checkedKeys;
+    },
+    /** 根据角色ID查询菜单树结构 */
+    getRoleMenuTreeselect(roleId) {
+      return roleMenuTreeselect(roleId).then((response) => {
+        this.menuOptions = response.menus;
+        return response;
+      });
+    },
+    /** 根据角色ID查询部门树结构 */
+    getDeptTree(roleId) {
+      return deptTreeSelect(roleId).then((response) => {
+        this.deptOptions = response.depts;
+        return response;
+      });
+    },
+    // 角色状态修改
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "启用" : "停用";
+      this.$modal
+        .confirm('确认要"' + text + '""' + row.roleName + '"角色吗?')
+        .then(function () {
+          return changeRoleStatus(row.roleId, row.status);
+        })
+        .then(() => {
+          this.$modal.msgSuccess(text + "成功");
+        })
+        .catch(function () {
+          row.status = row.status === "0" ? "1" : "0";
+        });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 取消按钮(数据权限)
+    cancelDataScope() {
+      this.openDataScope = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      if (this.$refs.menu != undefined) {
+        this.$refs.menu.setCheckedKeys([]);
+      }
+      (this.menuExpand = false),
+        (this.menuNodeAll = false),
+        (this.deptExpand = true),
+        (this.deptNodeAll = false),
+        (this.form = {
+          roleId: undefined,
+          roleName: undefined,
+          roleKey: undefined,
+          roleSort: 0,
+          status: "0",
+          menuIds: [],
+          deptIds: [],
+          menuCheckStrictly: true,
+          deptCheckStrictly: true,
+          remark: undefined,
+        });
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.selection = selection;
+      this.ids = selection.map((item) => item.roleId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    // 更多操作触发
+    handleCommand(command, row) {
+      switch (command) {
+        case "handleDataScope":
+          this.handleDataScope(row);
+          break;
+        case "handleAuthUser":
+          this.handleAuthUser(row);
+          break;
+        default:
+          break;
+      }
+    },
+    // 树权限(展开/折叠)
+    handleCheckedTreeExpand(value, type) {
+      if (type == "menu") {
+        let treeList = this.menuOptions;
+        for (let i = 0; i < treeList.length; i++) {
+          this.$refs.menu.store.nodesMap[treeList[i].id].expanded = value;
+        }
+      } else if (type == "dept") {
+        let treeList = this.deptOptions;
+        for (let i = 0; i < treeList.length; i++) {
+          this.$refs.dept.store.nodesMap[treeList[i].id].expanded = value;
+        }
+      }
+    },
+    // 树权限(全选/全不选)
+    handleCheckedTreeNodeAll(value, type) {
+      if (type == "menu") {
+        this.$refs.menu.setCheckedNodes(value ? this.menuOptions : []);
+      } else if (type == "dept") {
+        this.$refs.dept.setCheckedNodes(value ? this.deptOptions : []);
+      }
+    },
+    // 树权限(父子联动)
+    handleCheckedTreeConnect(value, type) {
+      if (type == "menu") {
+        this.form.menuCheckStrictly = value ? true : false;
+      } else if (type == "dept") {
+        this.form.deptCheckStrictly = value ? true : false;
+      }
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.getMenuTreeselect();
+      this.open = true;
+      this.title = "添加角色";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const roleId = row.roleId || this.ids;
+      const roleMenu = this.getRoleMenuTreeselect(roleId);
+      getRole(roleId).then((response) => {
+        this.form = response.data;
+        this.open = true;
+        this.$nextTick(() => {
+          roleMenu.then((res) => {
+            let checkedKeys = res.checkedKeys;
+            checkedKeys.forEach((v) => {
+              this.$nextTick(() => {
+                this.$refs.menu.setChecked(v, true, false);
+              });
+            });
+          });
+        });
+        this.title = "修改角色";
+      });
+    },
+    /** 选择角色权限范围触发 */
+    dataScopeSelectChange(value) {
+      if (value !== "2") {
+        this.$refs.dept.setCheckedKeys([]);
+      }
+    },
+    /** 分配数据权限操作 */
+    handleDataScope(row) {
+      this.reset();
+      const deptTreeSelect = this.getDeptTree(row.roleId);
+      getRole(row.roleId).then((response) => {
+        this.form = response.data;
+        this.openDataScope = true;
+        this.$nextTick(() => {
+          deptTreeSelect.then((res) => {
+            this.$refs.dept.setCheckedKeys(res.checkedKeys);
+          });
+        });
+        this.title = "分配数据权限";
+      });
+    },
+    /** 分配用户操作 */
+    handleAuthUser: function (row) {
+      const roleId = row.roleId;
+      this.$router.push("/system/role-auth/user/" + roleId);
+    },
+    /** 提交按钮 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          this.form.tenantId = this.$store.state.user.tenant.tenantId;
+          if (this.form.roleId != undefined) {
+            this.form.menuIds = this.getMenuAllCheckedKeys();
+            updateRole(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            this.form.menuIds = this.getMenuAllCheckedKeys();
+            addRole(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 提交按钮(数据权限) */
+    submitDataScope: function () {
+      if (this.form.roleId != undefined) {
+        this.form.deptIds = this.getDeptAllCheckedKeys();
+        dataScope(this.form).then((response) => {
+          this.$modal.msgSuccess("修改成功");
+          this.openDataScope = false;
+          this.getList();
+        });
+      }
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const roleIds = row.roleId || this.ids;
+      this.$modal
+        .confirm('是否确认删除角色编号为"' + roleIds + '"的数据项?')
+        .then(function () {
+          return delRole(roleIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "system/role/export",
+        {
+          ...this.queryParams,
+        },
+        `role_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>

+ 1003 - 0
zkqy-ui/src/views/amichi/system/user/index.vue

@@ -0,0 +1,1003 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <!--部门数据-->
+      <el-col :span="4" :xs="24">
+        <div class="head-container">
+          <el-input
+            v-model="deptName"
+            placeholder="请输入部门名称"
+            clearable
+            size="small"
+            prefix-icon="el-icon-search"
+            style="margin-bottom: 20px"
+          />
+        </div>
+        <div class="head-container">
+          <el-tree
+            :data="deptOptions"
+            :props="defaultProps"
+            :expand-on-click-node="false"
+            :filter-node-method="filterNode"
+            ref="tree"
+            node-key="id"
+            default-expand-all
+            highlight-current
+            @node-click="handleNodeClick"
+          />
+        </div>
+      </el-col>
+      <!--用户数据-->
+      <el-col :span="20" :xs="24">
+        <el-form
+          :model="queryParams"
+          ref="queryForm"
+          size="small"
+          :inline="true"
+          v-show="showSearch"
+          label-width="68px"
+        >
+          <el-form-item label="用户名称" prop="userName">
+            <el-input
+              v-model="queryParams.userName"
+              placeholder="请输入用户名称"
+              clearable
+              style="width: 240px"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <!-- <el-form-item label="租户名称" prop="tenantName">
+            <el-input
+              v-model="queryParams.tenantName"
+              placeholder="请输租户户名称"
+              clearable
+              style="width: 240px"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item> -->
+          <el-form-item label="手机号码" prop="phonenumber">
+            <el-input
+              v-model="queryParams.phonenumber"
+              placeholder="请输入手机号码"
+              clearable
+              style="width: 240px"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="状态" prop="status">
+            <el-select
+              v-model="queryParams.status"
+              placeholder="用户状态"
+              clearable
+              style="width: 240px"
+            >
+              <el-option
+                v-for="dict in dict.type.sys_normal_disable"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="创建时间">
+            <el-date-picker
+              v-model="dateRange"
+              style="width: 240px"
+              value-format="yyyy-MM-dd"
+              type="daterange"
+              range-separator="-"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+            ></el-date-picker>
+          </el-form-item>
+          <el-form-item>
+            <el-button
+              type="primary"
+              icon="el-icon-search"
+              size="mini"
+              @click="handleQuery"
+              >搜索
+            </el-button>
+            <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+              >重置
+            </el-button>
+          </el-form-item>
+        </el-form>
+
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button
+              type="primary"
+              plain
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+              v-hasPermi="['system:user:add']"
+              >新增
+            </el-button>
+          </el-col>
+          <!-- <el-col :span="1.5">
+            <el-button
+              type="success"
+              plain
+              icon="el-icon-edit"
+              size="mini"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['system:user:edit']"
+              >修改</el-button
+            >
+          </el-col> -->
+          <el-col :span="1.5">
+            <el-button
+              type="danger"
+              plain
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['system:user:remove']"
+              >删除
+            </el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="info"
+              plain
+              icon="el-icon-upload2"
+              size="mini"
+              @click="handleImport"
+              v-hasPermi="['system:user:import']"
+              >导入
+            </el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              v-if="selection.length == 0"
+              type="warning"
+              plain
+              icon="el-icon-download"
+              size="mini"
+              @click="handleExport"
+              v-hasPermi="['system:user:export']"
+              >导出
+            </el-button>
+            <ExcelDownLoad
+              v-else
+              :headerList="headerList"
+              :fieldList="selection"
+              :excelTitle="excelTitle"
+            ></ExcelDownLoad>
+          </el-col>
+          <right-toolbar
+            :showSearch.sync="showSearch"
+            @queryTable="getList"
+            :columns="columns"
+          ></right-toolbar>
+        </el-row>
+
+        <el-table
+          v-loading="loading"
+          :data="userList"
+          style="margin-top: 20px"
+          ref="tableRef"
+          @selection-change="handleSelectionChange"
+        >
+          <el-table-column type="selection" width="50" align="center" />
+          <el-table-column label="用户编号" align="center" key="userId" prop="userId" v-if="columns[0].visible"/>
+          <el-table-column label="用户名称" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true"/>
+
+          <el-table-column label="用户昵称" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true"/>
+          <el-table-column label="部门" align="center" key="deptName" prop="dept.deptName" v-if="columns[3].visible" :show-overflow-tooltip="true"
+          />
+          <el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" v-if="columns[4].visible" />
+          <el-table-column label="状态" align="center" key="status" v-if="columns[5].visible">
+            <template slot-scope="scope">
+              <el-switch
+                v-if="isShowHandlerBtn(scope.row)"
+                v-model="scope.row.status"
+                active-value="0"
+                inactive-value="1"
+                @change="handleStatusChange(scope.row)"
+              ></el-switch>
+            </template>
+          </el-table-column>
+          <el-table-column label="创建时间" align="center" prop="createTime" v-if="columns[6].visible" >
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.createTime) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="操作"
+            align="center"
+            width="160"
+            class-name="small-padding fixed-width"
+          >
+            <template slot-scope="scope" v-if="isShowHandlerBtn(scope.row)">
+              <el-dropdown>
+                <el-button type="warning" plain size="small">
+                  处理<i class="el-icon-arrow-down el-icon--right"></i>
+                </el-button>
+                <el-dropdown-menu slot="dropdown">
+                  <el-dropdown-item>
+                    <el-button
+                      size="mini"
+                      type="text"
+                      icon="el-icon-edit"
+                      @click="printEmployeeCode(scope.row)"
+                      v-hasPermi="['system:user:edit']"
+                    >打印员工码
+                    </el-button>
+                  </el-dropdown-item>
+                  <el-dropdown-item>
+                    <el-button
+                      size="mini"
+                      type="text"
+                      icon="el-icon-edit"
+                      @click="handleUpdate(scope.row)"
+                      v-hasPermi="['system:user:edit']"
+                      >修改
+                    </el-button>
+                  </el-dropdown-item>
+                  <el-dropdown-item>
+                    <el-button
+                      size="mini"
+                      type="text"
+                      icon="el-icon-delete"
+                      @click="handleDelete(scope.row)"
+                      v-hasPermi="['system:user:remove']"
+                      >删除
+                    </el-button>
+                  </el-dropdown-item>
+                  <el-dropdown-item>
+                    <el-dropdown
+                      size="mini"
+                      @command="(command) => handleCommand(command, scope.row)"
+                      v-hasPermi="['system:user:resetPwd', 'system:user:edit']"
+                    >
+                      <el-button
+                        size="mini"
+                        type="text"
+                        icon="el-icon-d-arrow-right"
+                        >更多
+                      </el-button>
+                      <el-dropdown-menu slot="dropdown">
+                        <el-dropdown-item
+                          command="handleResetPwd"
+                          icon="el-icon-key"
+                          v-hasPermi="['system:user:resetPwd']"
+                          >重置密码
+                        </el-dropdown-item>
+                        <el-dropdown-item
+                          command="handleAuthRole"
+                          icon="el-icon-circle-check"
+                          v-hasPermi="['system:user:edit']"
+                          >分配角色
+                        </el-dropdown-item>
+                      </el-dropdown-menu>
+                    </el-dropdown>
+                  </el-dropdown-item>
+                </el-dropdown-menu>
+              </el-dropdown>
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <pagination
+          v-show="total > 0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+        />
+      </el-col>
+    </el-row>
+
+    <!-- 添加或修改用户配置对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="用户昵称" prop="nickName">
+              <el-input
+                v-model="form.nickName"
+                placeholder="请输入用户昵称"
+                maxlength="30"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="归属部门" prop="deptId">
+              <treeselect
+                v-model="form.deptId"
+                :options="deptOptions"
+                :show-count="true"
+                placeholder="请选择归属部门"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="12">
+            <el-form-item
+              v-if="form.userId == undefined"
+              label="用户账号"
+              prop="userName"
+            >
+              <el-input
+                v-model="form.userName"
+                placeholder="请输入用户账号"
+                maxlength="30"
+              />
+            </el-form-item>
+            <el-input style="position: fixed; bottom: -9999px"></el-input>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item
+              v-if="form.userId == undefined"
+              label="用户密码"
+              prop="password"
+            >
+              <el-input
+                type="password"
+                style="position: fixed; bottom: -9999px"
+              ></el-input>
+              <el-input
+                v-model="form.password"
+                placeholder="请输入用户密码"
+                type="password"
+                maxlength="20"
+                show-password
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="手机号码" prop="phonenumber">
+              <el-input
+                v-model="form.phonenumber"
+                placeholder="请输入手机号码"
+                maxlength="11"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="角色">
+              <el-select
+                v-model="form.roleIds"
+                multiple
+                placeholder="请选择角色"
+              >
+                <el-option
+                  v-for="item in roleOptions"
+                  :key="item.roleId"
+                  :label="item.roleName"
+                  :value="item.roleId"
+                  :disabled="item.status == 1"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="用户性别">
+              <el-select v-model="form.sex" placeholder="请选择性别">
+                <el-option
+                  v-for="dict in dict.type.sys_user_sex"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="状态">
+              <el-radio-group v-model="form.status">
+                <el-radio
+                  v-for="dict in dict.type.sys_normal_disable"
+                  :key="dict.value"
+                  :label="dict.value"
+                  >{{ dict.label }}
+                </el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="备注">
+              <el-input
+                v-model="form.remark"
+                type="textarea"
+                placeholder="请输入内容"
+              ></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 添加或修改用户配置对话框 -->
+    <el-dialog :title="title" :visible.sync="employeeCodeOpen" width="500px"  append-to-body>
+      <div style="width: 500px;height: 450px" id="printView">
+           <div class="imgBox">
+             <img :src="imgBase" alt="" style="text-align: center;margin-left: 28px">
+           </div>
+           <div style="margin-top: 15px">
+             <p style="text-align: center;font-size: 18px"><span>员工编号:</span> <em>{{employeeNumber}}</em><span style="margin-left: 20px">姓名:</span> <em>{{employeeName}}</em></p>
+           </div>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="success" v-print="printViewInfo" >打印二维码</el-button>
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+
+    <!-- 用户导入对话框 -->
+    <el-dialog
+      :title="upload.title"
+      :visible.sync="upload.open"
+      width="400px"
+      append-to-body
+    >
+      <el-upload
+        ref="upload"
+        :limit="1"
+        accept=".xlsx, .xls"
+        :headers="upload.headers"
+        :action="upload.url + '?updateSupport=' + upload.updateSupport"
+        :disabled="upload.isUploading"
+        :on-progress="handleFileUploadProgress"
+        :on-success="handleFileSuccess"
+        :auto-upload="false"
+        drag
+      >
+        <i class="el-icon-upload"></i>
+        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+        <div class="el-upload__tip text-center" slot="tip">
+          <div class="el-upload__tip" slot="tip">
+            <el-checkbox v-model="upload.updateSupport" />
+            是否更新已经存在的用户数据
+          </div>
+          <span>仅允许导入xls、xlsx格式文件。</span>
+          <el-link
+            type="primary"
+            :underline="false"
+            style="font-size: 12px; vertical-align: baseline"
+            @click="importTemplate"
+            >下载模板
+          </el-link>
+        </div>
+      </el-upload>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitFileForm">确 定</el-button>
+        <el-button @click="upload.open = false">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listUser,
+  getUser,
+  delUser,
+  addUser,
+  updateUser,
+  resetUserPwd,
+  changeUserStatus,
+  deptTreeSelect,
+  generateEmployeeCode,
+} from "@/api/system/user";
+
+import { getToken } from "@/utils/auth";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import { mapGetters } from "vuex";
+import { getIsExistUser } from "@/api/system/user";
+import ExcelDownLoad from "@/components/ExcelDownLoad/index.vue";
+export default {
+  name: "User",
+  dicts: ["sys_normal_disable", "sys_user_sex", "is_can_tools"],
+  components: { Treeselect, ExcelDownLoad },
+  data() {
+    return {
+      employeeCodeOpen:false,
+      employeeNumber:"",
+      employeeName:"",
+      imgBase:"",
+      dictLoginTools: [
+        { value: "0", label: "允许" },
+        { value: "1", label: "禁止" },
+      ],
+      // 前端导出数据
+      headerList: {
+        用户序号: "userId",
+        部门编号: "deptId",
+        登录名称: "userName",
+        用户名称: "nickName",
+        用户邮箱: "email",
+        手机号码: "phonenumber",
+        用户性别: "sex",
+        帐号状态: "status",
+        最后登录IP: "loginIp",
+        最后登录时间: "loginDate",
+        部门名称: "deptName",
+        部门负责人: "leader",
+      },
+      excelTitle: "user",
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 选中数组(包含所有数据)
+      selection: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 用户表格数据
+      userList: null,
+      // 弹出层标题
+      title: "",
+      // 部门树选项
+      deptOptions: undefined,
+      // 是否显示弹出层
+      open: false,
+      // 部门名称
+      deptName: undefined,
+      // 默认密码
+      initPassword: undefined,
+      // 日期范围
+      dateRange: [],
+      // 岗位选项
+      postOptions: [],
+      // 角色选项
+      roleOptions: [],
+      // 表单参数
+      form: {},
+      oldNickname: "", //旧昵称
+      defaultProps: {
+        children: "children",
+        label: "label",
+      },
+      // 用户导入参数
+      upload: {
+        // 是否显示弹出层(用户导入)
+        open: false,
+        // 弹出层标题(用户导入)
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的用户数据
+        updateSupport: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + "/system/user/importData",
+      },
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userName: undefined,
+        //tenantName: undefined,
+        phonenumber: undefined,
+        status: undefined,
+        deptId: undefined,
+        userType: "01",
+      },
+      // 列信息
+      columns: [
+        { key: 0, label: `用户编号`, visible: true },
+        { key: 1, label: `用户名称`, visible: true },
+        { key: 2, label: `用户昵称`, visible: true },
+        { key: 3, label: `部门`, visible: true },
+        { key: 4, label: `手机号码`, visible: true },
+        { key: 5, label: `状态`, visible: true },
+        { key: 6, label: `创建时间`, visible: true },
+        { key: 7, label: `租户名称`, visible: true },
+      ],
+      // 表单校验
+      rules: {
+        userName: [
+          { required: true, message: "用户名称不能为空", trigger: "blur" },
+          {
+            min: 2,
+            max: 20,
+            message: "用户名称长度必须介于 2 和 20 之间",
+            trigger: "blur",
+          },
+          { trigger: "blur", validator: this.validateNickName },
+        ],
+        nickName: [
+          { required: true, message: "用户昵称不能为空", trigger: "blur" },
+        ],
+        password: [
+          { required: true, message: "用户密码不能为空", trigger: "blur" },
+          {
+            min: 5,
+            max: 20,
+            message: "用户密码长度必须介于 5 和 20 之间",
+            trigger: "blur",
+          },
+        ],
+        email: [
+          {
+            type: "email",
+            message: "请输入正确的邮箱地址",
+            trigger: ["blur", "change"],
+          },
+        ],
+        phonenumber: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "请输入正确的手机号码",
+            trigger: "blur",
+          },
+        ],
+      },
+      msg: "打印",
+      printViewInfo: {
+        id: "printView", //打印区域的唯一的id属性
+        // popTitle: '配置页眉标题', // 页眉文字 (不设置时显示undifined)(页眉页脚可以在打印页面的更多设置的选项中取消勾选)
+        // extraHead: '打印,印刷', // 最左上方的头部文字,附加在head标签上的额外标签,使用逗号分割
+        preview: false, // 是否启动预览模式,默认是false (开启预览模式ture会占满整个屏幕,不建议开启,除非业务需要)
+        // previewTitle: '预览的标题', // 打印预览的标题(预览模式preview为true时才显示)
+        // previewPrintBtnLabel: '预览结束,开始打印', // 打印预览的标题下方的按钮文本,点击可进入打印(预览模式preview为true时才显示)
+        zIndex: 20002, // 预览窗口的z-index,默认是20002,最好比默认值更高
+        previewBeforeOpenCallback (that) { console.log('正在加载预览窗口!'); console.log(that.msg, this) }, // 预览窗口打开之前的callback (预览模式preview为true时才执行) (that可以取到data里的变量值)
+        previewOpenCallback () { console.log('已经加载完预览窗口,预览打开了!') }, // 预览窗口打开时的callback (预览模式preview为true时才执行)
+        beforeOpenCallback () { console.log('开始打印之前!') }, // 开始打印之前的callback
+        openCallback () { console.log('执行打印了!') }, // 调用打印时的callback
+        closeCallback () { console.log('关闭了打印工具!') }, // 关闭打印的callback(无法区分确认or取消)
+        clickMounted () { console.log('点击v-print绑定的按钮了!') },
+        // url: 'http://localhost:8080/', // 打印指定的URL,确保同源策略相同
+        // asyncUrl (reslove) {
+        //   setTimeout(() => {
+        //     reslove('http://localhost:8080/')
+        //   }, 2000)
+        // },
+        standard: '',
+        extarCss: ''
+      }
+    };
+  },
+  watch: {
+    // 根据名称筛选部门树
+    deptName(val) {
+      this.$refs.tree.filter(val);
+    },
+  },
+  activated() {
+    this.getDeptTree();
+  },
+  created() {
+    this.getList();
+    this.getDeptTree();
+    this.getConfigKey("sys.user.initPassword").then((response) => {
+      this.initPassword = response.msg;
+    });
+  },
+  computed: {
+    ...mapGetters(["name"]),
+    isHasAdmin() {
+      return this.name == "admin";
+    },
+  },
+  methods: {
+    printEmployeeCode(row){
+      console.log("成成")
+      this.employeeNumber=row.userId;
+      this.employeeName=row.nickName;
+      this.generateEmployeeCodeApi({"userNumber":row.userId,"userName":row.nickName});
+    },
+    dycf(){
+      console.log("打印触发")
+      this.employeeCodeOpen=false;
+    },
+    async generateEmployeeCodeApi(obj){
+      await generateEmployeeCode(obj).then((res) => {
+        console.log(res);
+        if (res.code == 200) {
+           this.imgBase=res.data;
+           this.employeeCodeOpen=true;
+        }
+      });
+    },
+    // 校验用户昵称是否重复
+    async validateNickName(rule, value, callback) {
+      if (value) {
+        await getIsExistUser({ userName: value }).then((res) => {
+          console.log(res);
+          if (res.code == 200) {
+            if (res.data) {
+              callback();
+            } else {
+              callback(new Error("用户名称已存在"));
+            }
+          } else {
+            callback(new Error("用户名称校验失败,请重新输入"));
+          }
+        });
+      }
+      callback();
+    },
+    // 表格中操作按钮的显示与隐藏
+    isShowHandlerBtn(row) {
+      if (this.isHasAdmin) {
+        return !row.admin;
+      } else {
+        return !row.tenantAdmin;
+      }
+    },
+    /** 查询用户列表 */
+    getList() {
+      this.loading = true;
+      let tempSelection = JSON.parse(JSON.stringify(this.selection));
+      listUser(this.addDateRange(this.queryParams, this.dateRange)).then(
+        (response) => {
+          response.rows = response.rows.filter(
+            (item) => !tempSelection.find((val) => val.userId == item.userId)
+          );
+          // this.userList = [...tempSelection, ...response.rows];
+          this.userList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        }
+      );
+    },
+    /** 查询部门下拉树结构 */
+    getDeptTree() {
+      deptTreeSelect().then((response) => {
+        this.deptOptions = response.data;
+      });
+    },
+    // 筛选节点
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.label.indexOf(value) !== -1;
+    },
+    // 节点单击事件
+    handleNodeClick(data) {
+      this.queryParams.deptId = data.id;
+      this.handleQuery();
+    },
+    // 用户状态修改
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "启用" : "停用";
+      this.$modal
+        .confirm('确认要"' + text + '""' + row.userName + '"用户吗?')
+        .then(function () {
+          return changeUserStatus(row.userId, row.status);
+        })
+        .then(() => {
+          this.$modal.msgSuccess(text + "成功");
+        })
+        .catch(function () {
+          row.status = row.status === "0" ? "1" : "0";
+        });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.employeeCodeOpen=false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: [],
+        isCanTools: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.queryParams.deptId = undefined;
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.userId);
+      this.selection = selection;
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    // 更多操作触发
+    handleCommand(command, row) {
+      switch (command) {
+        case "handleResetPwd":
+          this.handleResetPwd(row);
+          break;
+        case "handleAuthRole":
+          this.handleAuthRole(row);
+          break;
+        default:
+          break;
+      }
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      // alert("dddddddddddddd")
+      this.reset();
+      getUser().then((response) => {
+        this.postOptions = response.posts;
+        this.roleOptions = response.roles;
+        this.open = true;
+        this.title = "添加用户";
+        this.form.password = this.initPassword;
+      });
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const userId = row.userId || this.ids;
+      getUser(userId).then((response) => {
+        this.form = response.data;
+        this.oldNickname = response.data.nickname; //记录旧的昵称
+        this.postOptions = response.posts;
+        this.roleOptions = response.roles;
+        this.$set(this.form, "postIds", response.postIds);
+        this.$set(this.form, "roleIds", response.roleIds);
+        this.open = true;
+        this.title = "修改用户";
+        this.form.password = "";
+      });
+    },
+    /** 重置密码按钮操作 */
+    handleResetPwd(row) {
+      this.$prompt('请输入"' + row.userName + '"的新密码', "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        closeOnClickModal: false,
+        inputPattern: /^.{5,20}$/,
+        inputErrorMessage: "用户密码长度必须介于 5 和 20 之间",
+      })
+        .then(({ value }) => {
+          resetUserPwd(row.userId, value).then((response) => {
+            this.$modal.msgSuccess("修改成功,新密码是:" + value);
+          });
+        })
+        .catch(() => {});
+    },
+    /** 分配角色操作 */
+    handleAuthRole: function (row) {
+      const userId = row.userId;
+      this.$router.push("/system/user-auth/role/" + userId);
+    },
+    /** 提交按钮 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.userId != undefined) {
+            updateUser(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUser(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$modal
+        .confirm('是否确认删除用户编号为"' + userIds + '"的数据项?')
+        .then(function () {
+          return delUser(userIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "system/user/export",
+        {
+          ...this.queryParams,
+        },
+        `user_${new Date().getTime()}.xlsx`
+      );
+    },
+    /** 导入按钮操作 */
+    handleImport() {
+      this.upload.title = "用户导入";
+      this.upload.open = true;
+    },
+    /** 下载模板操作 */
+    importTemplate() {
+      this.download(
+        "system/user/importTemplate",
+        {},
+        `user_template_${new Date().getTime()}.xlsx`
+      );
+    },
+    // 文件上传中处理
+    handleFileUploadProgress(event, file, fileList) {
+      this.upload.isUploading = true;
+    },
+    // 文件上传成功处理
+    handleFileSuccess(response, file, fileList) {
+      this.upload.open = false;
+      this.upload.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert(
+        "<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
+          response.msg +
+          "</div>",
+        "导入结果",
+        { dangerouslyUseHTMLString: true }
+      );
+      this.getList();
+    },
+    // 提交上传文件
+    submitFileForm() {
+      this.$refs.upload.submit();
+    },
+  },
+};
+</script>
+<style scoped>
+em{
+  list-style: none;
+  font-style:normal;
+}
+@media print {
+  /* 隐藏页眉页脚 */
+  @page {
+    size: auto;
+  }
+  html {
+    zoom: 85%; /* 缩放比例设置 */
+  }
+  *{
+    margin: 0 auto;
+    padding: 0;
+  }
+}
+
+</style>

+ 162 - 30
zkqy-ui/src/views/amichi/terminalInformation/index.vue

@@ -80,11 +80,13 @@
     <el-table v-loading="loading" style="margin-top: 20px;" :data="terminalInformationList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
 <!--      <el-table-column label="主键" align="center" prop="id" />-->
-      <el-table-column label="终端编号" align="center" prop="terminalId" />
-      <el-table-column label="设备名称" align="center" prop="stationName" />
-      <el-table-column label="设备编号" align="center" prop="deviceId" />
+      <el-table-column label="手环名称" align="center" prop="stationName" />
+<!--      <el-table-column label="设备编号" align="center" prop="deviceId" />-->
+<!--      <el-table-column label="终端编号" align="center" prop="terminalId" />-->
+      <el-table-column label="终端名称" align="center" prop="terminalName" />
+      <el-table-column label="用户信息" align="center" prop="personnelName" />
+      <el-table-column label="工序信息" align="center" prop="processName" />
       <el-table-column label="备注" align="center" prop="remark" />
-<!--      <el-table-column label="创建者id" align="center" prop="createById" />-->
 <!--      <el-table-column label="更新者id" align="center" prop="updateById" />-->
 <!--      <el-table-column label="数据条审批状态" align="center" prop="dataApprovalStatus" />-->
 <!--      <el-table-column label="流程编号" align="center" prop="processKey" />-->
@@ -113,35 +115,84 @@
     />
 
     <!-- 添加或修改终端信息对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+<!--        <el-form-item label="终端编号" prop="terminalId">-->
+<!--          <el-input v-model="form.terminalId" placeholder="请输入终端编号" />-->
+<!--        </el-form-item>-->
         <el-form-item label="终端编号" prop="terminalId">
-          <el-input v-model="form.terminalId" placeholder="请输入终端编号" />
+          <el-select
+            v-model="form.terminalId"
+            size="small"
+            style="width: 680px"
+            filterable
+            @change="listTerminalSelected()"
+          >
+            <el-option
+              v-for="(item,index) in listTerminal"
+              :key="index"
+              :label="item.handheldTerminalName"
+              :value="item.handheldTerminalNumber"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+<!--        <el-form-item label="设备名称" prop="stationName">-->
+<!--          <el-input v-model="form.stationName" placeholder="请输入设备名称" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="设备编号" prop="deviceId">-->
+<!--          <el-input v-model="form.deviceId" placeholder="请输入设备编号" />-->
+<!--        </el-form-item>-->
+        <el-form-item label="手环终端" prop="deviceId">
+          <el-select
+            v-model="form.deviceId"
+            size="small"
+            style="width: 680px"
+            @change="listRingTerminalSelected()"
+            filterable
+          >
+            <el-option
+              v-for="(item,index) in listRingTerminal"
+              :key="index"
+              :label="item.handheldTerminalName"
+              :value="item.handheldTerminalNumber">
+            </el-option>
+          </el-select>
         </el-form-item>
-        <el-form-item label="设备名称" prop="stationName">
-          <el-input v-model="form.stationName" placeholder="请输入设备名称" />
+<!--        listRingTerminal-->
+        <el-form-item label="人员姓名" prop="personnelName">
+          <el-select
+            v-model="form.personnelName"
+            size="small"
+            style="width: 680px"
+            filterable
+          >
+            <el-option
+              v-for="(item,index) in userInfo"
+              :key="index"
+              :label="item.nickName"
+              :value="item.nickName"
+            ></el-option>
+          </el-select>
         </el-form-item>
-        <el-form-item label="设备编号" prop="deviceId">
-          <el-input v-model="form.deviceId" placeholder="请输入设备编号" />
+        <el-form-item label="工序" prop="process">
+          <el-select
+            v-model="form.process"
+            size="small"
+            style="width: 680px"
+            filterable
+            @change="processListSelected()"
+          >
+            <el-option
+              v-for="(item,index) in processList"
+              :key="index"
+              :label="item.procedurName"
+              :value="item.procedureNumber"
+            ></el-option>
+          </el-select>
         </el-form-item>
         <el-form-item label="备注" prop="remark">
           <el-input v-model="form.remark" placeholder="请输入备注" />
         </el-form-item>
-<!--        <el-form-item label="创建者id" prop="createById">-->
-<!--          <el-input v-model="form.createById" placeholder="请输入创建者id" />-->
-<!--        </el-form-item>-->
-<!--        <el-form-item label="更新者id" prop="updateById">-->
-<!--          <el-input v-model="form.updateById" placeholder="请输入更新者id" />-->
-<!--        </el-form-item>-->
-<!--        <el-form-item label="删除标志" prop="delFlag">-->
-<!--          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />-->
-<!--        </el-form-item>-->
-<!--        <el-form-item label="流程编号" prop="processKey">-->
-<!--          <el-input v-model="form.processKey" placeholder="请输入流程编号" />-->
-<!--        </el-form-item>-->
-<!--        <el-form-item label="任务编码" prop="taskProcessKey">-->
-<!--          <el-input v-model="form.taskProcessKey" placeholder="请输入任务编码" />-->
-<!--        </el-form-item>-->
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
@@ -153,6 +204,10 @@
 
 <script>
 import { listTerminalInformation, getTerminalInformation, delTerminalInformation, addTerminalInformation, updateTerminalInformation } from "@/api/amichi/terminalInformation/terminalInformation.js";
+import {listUserInformation} from  "@/api/amichi/user/user"
+import {listTerminal} from  "@/api/amichi/handheldTerminal/terminal"
+import {listRingTerminal} from  "@/api/amichi/RingTerminal/terminal"
+import { listList} from "@/api/amichi/procedureList/list";
 
 export default {
   name: "TerminalInformation",
@@ -170,7 +225,8 @@ export default {
       showSearch: true,
       // 总条数
       total: 0,
-      // 终端信息表格数据
+      userInfo:[],
+      // 终端绑定信息表格数据
       terminalInformationList: [],
       // 弹出层标题
       title: "",
@@ -187,10 +243,24 @@ export default {
         updateById: null,
         dataApprovalStatus: null,
         processKey: null,
-        taskProcessKey: null
+        process:null,
+        taskProcessKey: null,
+        personnelName:null
       },
+      //终端列表
+      listTerminal:[],
+      //指环列表
+      listRingTerminal:[],
+      //工序列表
+      processList:[],
       // 表单参数
-      form: {},
+      form: {
+        deviceId:"",
+        stationName:"",
+        process:"",
+        processName:"",
+        terminalName:"",
+      },
       // 表单校验
       rules: {
       }
@@ -200,6 +270,53 @@ export default {
     this.getList();
   },
   methods: {
+    //查询终端信息
+    listRingTerminalSelected(){
+      console.log("stationName",  this.form.deviceId);
+      let obj = this.listRingTerminal.find(item=>item.handheldTerminalNumber==this.form.deviceId);
+      this.form.stationName=obj.handheldTerminalName;
+      console.log(this.form);
+    },
+    processListSelected(){
+      console.log("stationName",  this.form.procedurName);
+      let obj = this.processList.find(item=>item.procedureNumber==this.form.process);
+      this.form.processName=obj.procedurName;
+    },
+    listTerminalSelected(){
+      console.log("stationName",  this.form.deviceId);
+      let obj = this.listTerminal.find(item=>item.handheldTerminalNumber==this.form.terminalId);
+      console.log(obj)
+      this.form.terminalName=obj.handheldTerminalName;
+      console.log(this.form);
+    },
+    /**
+     * 查询工序列表
+     */
+    processListApi(){
+      this.processList=[];
+      listList({"isEnablePaging":false}).then(response => {
+        this.processList = response.rows;
+      });
+    },
+    /**
+     * 查询工序列表信息
+     *
+     */
+    listRingTerminalApi(){
+      this.listRingTerminal=[];
+      listRingTerminal({"isEnablePaging":false}).then(response => {
+        this.listRingTerminal = response.rows;
+      });
+    },
+    /**
+     * 查询手持终端列表信息
+     */
+    listTerminalApi(){
+      this.listTerminal=[];
+      listTerminal({"isEnablePaging":false}).then(response => {
+        this.listTerminal = response.rows;
+      });
+    },
     /** 查询终端信息列表 */
     getList() {
       this.loading = true;
@@ -227,6 +344,13 @@ export default {
       this.open = false;
       this.reset();
     },
+    getListUserInformation(){
+      this.userInfo=[];
+      listUserInformation().then(resp=>{
+        this.userInfo=resp.rows.filter(item=>item.userName!="fjqyAdmin");
+        console.log(this.userInfo);
+      })
+    },
     // 表单重置
     reset() {
       this.form = {
@@ -267,17 +391,25 @@ export default {
     /** 新增按钮操作 */
     handleAdd() {
       this.reset();
+      this.getListUserInformation();
+      this.listTerminalApi();
+      this.listRingTerminalApi();
+      this.processListApi();
       this.open = true;
-      this.title = "添加终端信息";
+      this.title = "添加绑定信息";
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
       this.reset();
       const id = row.id || this.ids
+      this.getListUserInformation();
+      this.listTerminalApi();
+      this.listRingTerminalApi();
+      this.processListApi();
       getTerminalInformation(id).then(response => {
         this.form = response.data;
         this.open = true;
-        this.title = "修改终端信息";
+        this.title = "修改绑定信息";
       });
     },
     /** 提交按钮 */

+ 2 - 2
zkqy-ui/src/views/login.vue

@@ -307,9 +307,9 @@ export default {
             Cookies.remove("rememberMe");
           }
           let form = {
-              uri: "?client_id=hmc&scope=basic&response_type=code&state=AB1357&redirect_uri=http://192.168.2.127:8066/oauth/callback",
+               uri: "?client_id=hmc&scope=basic&response_type=code&state=AB1357&redirect_uri=http://192.168.2.127:8066/oauth/callback",
                //uri:"?client_id=mestools&scope=basic&response_type=code&state=AB1357&redirect_uri=http://192.168.128.171:8066/oauth/callback",
-               // uri:"?client_id=mestools&scope=basic&response_type=code&state=AB1357&redirect_uri=http://192.168.2.135:8066/oauth/callback",
+              // uri:"?client_id=mestools&scope=basic&response_type=code&state=AB1357&redirect_uri=http://192.168.2.135:8066/oauth/callback",
              //uri:"?client_id=hmc&scope=basic&response_type=code&state=AB1357&redirect_uri=http://192.168.110.85:8066/oauth/callback",
              // uri:"?client_id=hmc&scope=basic&response_type=code&state=AB1357&redirect_uri=http://192.168.110.83:8066/oauth/callback",
             // uri:"?client_id=hmc&scope=basic&response_type=code&state=AB1357&redirect_uri=http://172.20.10.5:8066/oauth/callback",