Ver Fonte

Merge branch 'master' of http://60.171.161.56:20000/LIVE_YE/gongdan

wangmengwei há 1 mês atrás
pai
commit
a398297dd8
54 ficheiros alterados com 5152 adições e 45 exclusões
  1. 1 1
      pom.xml
  2. 32 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/chinaArea/ChinaAreaController.java
  3. 104 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/record/OperationRecordController.java
  4. 12 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
  5. 104 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/work/BasicInfoController.java
  6. 104 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/work/ChargeDetailsController.java
  7. 104 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/work/WorkOrderFjController.java
  8. 217 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/work/WorkOrderInfoController.java
  9. 39 2
      ruoyi-admin/src/main/resources/application-druid.yml
  10. 105 0
      ruoyi-admin/src/main/resources/application-prod.yml
  11. 3 38
      ruoyi-admin/src/main/resources/application.yml
  12. 7 0
      ruoyi-common/pom.xml
  13. 18 0
      ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java
  14. 2 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java
  15. 8 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java
  16. 137 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/ChinaArea.java
  17. 102 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java
  18. 79 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/base64/Base64DecodedMultipartFile.java
  19. 1 1
      ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
  20. 1 1
      ruoyi-generator/src/main/resources/generator.yml
  21. 2 2
      ruoyi-generator/src/main/resources/vm/java/controller.java.vm
  22. 24 0
      ruoyi-system/pom.xml
  23. 265 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/BasicInfo.java
  24. 127 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/ChargeDetails.java
  25. 116 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/OperationRecord.java
  26. 98 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/WorkOrderFj.java
  27. 579 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/WorkOrderInfo.java
  28. 29 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/WordVo.java
  29. 61 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/BasicInfoMapper.java
  30. 63 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/ChargeDetailsMapper.java
  31. 21 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/ChinaAreaMapper.java
  32. 61 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/OperationRecordMapper.java
  33. 63 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/WorkOrderFjMapper.java
  34. 72 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/WorkOrderInfoMapper.java
  35. 61 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/IBasicInfoService.java
  36. 61 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/IChargeDetailsService.java
  37. 18 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/IChinaAreaService.java
  38. 61 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/IOperationRecordService.java
  39. 2 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
  40. 61 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/IWorkOrderFjService.java
  41. 86 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/IWorkOrderInfoService.java
  42. 96 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BasicInfoServiceImpl.java
  43. 93 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ChargeDetailsServiceImpl.java
  44. 131 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ChinaAreaServiceImpl.java
  45. 102 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OperationRecordServiceImpl.java
  46. 10 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
  47. 93 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WorkOrderFjServiceImpl.java
  48. 825 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WorkOrderInfoServiceImpl.java
  49. 145 0
      ruoyi-system/src/main/resources/mapper/system/BasicInfoMapper.xml
  50. 84 0
      ruoyi-system/src/main/resources/mapper/system/ChargeDetailsMapper.xml
  51. 17 0
      ruoyi-system/src/main/resources/mapper/system/ChinaAreaMapper.xml
  52. 96 0
      ruoyi-system/src/main/resources/mapper/system/OperationRecordMapper.xml
  53. 78 0
      ruoyi-system/src/main/resources/mapper/system/WorkOrderFjMapper.xml
  54. 271 0
      ruoyi-system/src/main/resources/mapper/system/WorkOrderInfoMapper.xml

+ 1 - 1
pom.xml

@@ -27,7 +27,7 @@
         <fastjson.version>2.0.53</fastjson.version>
         <oshi.version>6.6.5</oshi.version>
         <commons.io.version>2.13.0</commons.io.version>
-        <poi.version>4.1.2</poi.version>
+        <poi.version>5.2.2</poi.version>
         <velocity.version>2.3</velocity.version>
         <jwt.version>0.9.1</jwt.version>
         <!-- override dependency version -->

+ 32 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/chinaArea/ChinaAreaController.java

@@ -0,0 +1,32 @@
+package com.ruoyi.web.controller.chinaArea;
+
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.ChinaArea;
+import com.ruoyi.system.service.IChinaAreaService;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * @author tjf
+ * @Date: 2022/03/25/9:39
+ */
+@RestController
+@RequestMapping("/chinaArea")
+public class ChinaAreaController {
+
+    @Resource
+    private IChinaAreaService chinaAreaService;
+    /**
+     * 获取行政区域规划下拉树列表
+     */
+    @PostMapping("/treeSelect")
+    public AjaxResult treeSelect(@RequestBody ChinaArea chinaArea)
+    {
+        return chinaAreaService.selectChinaAreaList(chinaArea);
+    }
+}

+ 104 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/record/OperationRecordController.java

@@ -0,0 +1,104 @@
+package com.ruoyi.web.controller.record;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+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.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.OperationRecord;
+import com.ruoyi.system.service.IOperationRecordService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 操作记录Controller
+ * 
+ * @author boman
+ * @date 2025-05-16
+ */
+@RestController
+@RequestMapping("/operation/record")
+public class OperationRecordController extends BaseController
+{
+    @Autowired
+    private IOperationRecordService operationRecordService;
+
+    /**
+     * 查询操作记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('operation:record:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(OperationRecord operationRecord)
+    {
+        startPage();
+        List<OperationRecord> list = operationRecordService.selectOperationRecordList(operationRecord);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出操作记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('operation:record:export')")
+    @Log(title = "操作记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, OperationRecord operationRecord)
+    {
+        List<OperationRecord> list = operationRecordService.selectOperationRecordList(operationRecord);
+        ExcelUtil<OperationRecord> util = new ExcelUtil<OperationRecord>(OperationRecord.class);
+        util.exportExcel(response, list, "操作记录数据");
+    }
+
+    /**
+     * 获取操作记录详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('operation:record:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(operationRecordService.selectOperationRecordById(id));
+    }
+
+    /**
+     * 新增操作记录
+     */
+    @PreAuthorize("@ss.hasPermi('operation:record:add')")
+    @Log(title = "操作记录", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody OperationRecord operationRecord)
+    {
+        return toAjax(operationRecordService.insertOperationRecord(operationRecord));
+    }
+
+    /**
+     * 修改操作记录
+     */
+    @PreAuthorize("@ss.hasPermi('operation:record:edit')")
+    @Log(title = "操作记录", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody OperationRecord operationRecord)
+    {
+        return toAjax(operationRecordService.updateOperationRecord(operationRecord));
+    }
+
+    /**
+     * 删除操作记录
+     */
+    @PreAuthorize("@ss.hasPermi('operation:record:remove')")
+    @Log(title = "操作记录", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(operationRecordService.deleteOperationRecordByIds(ids));
+    }
+}

+ 12 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java

@@ -65,6 +65,18 @@ public class SysUserController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 获取用户列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:noPage')")
+    @GetMapping("/noPage/list")
+    public TableDataInfo noPage(SysUser user)
+    {
+        //startPage();
+        List<SysUser> list = userService.noPage(user);
+        return getDataTable(list);
+    }
+
     @Log(title = "用户管理", businessType = BusinessType.EXPORT)
     @PreAuthorize("@ss.hasPermi('system:user:export')")
     @PostMapping("/export")

+ 104 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/work/BasicInfoController.java

@@ -0,0 +1,104 @@
+package com.ruoyi.web.controller.work;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+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.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.BasicInfo;
+import com.ruoyi.system.service.IBasicInfoService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 基本信息Controller
+ * 
+ * @author ruoyi
+ * @date 2025-05-12
+ */
+@RestController
+@RequestMapping("/basic/info")
+public class BasicInfoController extends BaseController
+{
+    @Autowired
+    private IBasicInfoService basicInfoService;
+
+    /**
+     * 查询基本信息列表
+     */
+    @PreAuthorize("@ss.hasPermi('basic:info:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(BasicInfo basicInfo)
+    {
+        startPage();
+        List<BasicInfo> list = basicInfoService.selectBasicInfoList(basicInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出基本信息列表
+     */
+    @PreAuthorize("@ss.hasPermi('basic:info:export')")
+    @Log(title = "基本信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, BasicInfo basicInfo)
+    {
+        List<BasicInfo> list = basicInfoService.selectBasicInfoList(basicInfo);
+        ExcelUtil<BasicInfo> util = new ExcelUtil<BasicInfo>(BasicInfo.class);
+        util.exportExcel(response, list, "基本信息数据");
+    }
+
+    /**
+     * 获取基本信息详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('basic:info:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(basicInfoService.selectBasicInfoById(id));
+    }
+
+    /**
+     * 新增基本信息
+     */
+    @PreAuthorize("@ss.hasPermi('basic:info:add')")
+    @Log(title = "基本信息", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody BasicInfo basicInfo)
+    {
+        return toAjax(basicInfoService.insertBasicInfo(basicInfo));
+    }
+
+    /**
+     * 修改基本信息
+     */
+    @PreAuthorize("@ss.hasPermi('basic:info:edit')")
+    @Log(title = "基本信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody BasicInfo basicInfo)
+    {
+        return toAjax(basicInfoService.updateBasicInfo(basicInfo));
+    }
+
+    /**
+     * 删除基本信息
+     */
+    @PreAuthorize("@ss.hasPermi('basic:info:remove')")
+    @Log(title = "基本信息", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(basicInfoService.deleteBasicInfoByIds(ids));
+    }
+}

+ 104 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/work/ChargeDetailsController.java

@@ -0,0 +1,104 @@
+package com.ruoyi.web.controller.work;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+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.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.ChargeDetails;
+import com.ruoyi.system.service.IChargeDetailsService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 工单收费详情Controller
+ * 
+ * @author ruoyi
+ * @date 2025-05-12
+ */
+@RestController
+@RequestMapping("/charge/details")
+public class ChargeDetailsController extends BaseController
+{
+    @Autowired
+    private IChargeDetailsService chargeDetailsService;
+
+    /**
+     * 查询工单收费详情列表
+     */
+    @PreAuthorize("@ss.hasPermi('charge:details:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(ChargeDetails chargeDetails)
+    {
+        startPage();
+        List<ChargeDetails> list = chargeDetailsService.selectChargeDetailsList(chargeDetails);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出工单收费详情列表
+     */
+    @PreAuthorize("@ss.hasPermi('charge:details:export')")
+    @Log(title = "工单收费详情", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ChargeDetails chargeDetails)
+    {
+        List<ChargeDetails> list = chargeDetailsService.selectChargeDetailsList(chargeDetails);
+        ExcelUtil<ChargeDetails> util = new ExcelUtil<ChargeDetails>(ChargeDetails.class);
+        util.exportExcel(response, list, "工单收费详情数据");
+    }
+
+    /**
+     * 获取工单收费详情详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('charge:details:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(chargeDetailsService.selectChargeDetailsById(id));
+    }
+
+    /**
+     * 新增工单收费详情
+     */
+    @PreAuthorize("@ss.hasPermi('charge:details:add')")
+    @Log(title = "工单收费详情", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ChargeDetails chargeDetails)
+    {
+        return toAjax(chargeDetailsService.insertChargeDetails(chargeDetails));
+    }
+
+    /**
+     * 修改工单收费详情
+     */
+    @PreAuthorize("@ss.hasPermi('charge:details:edit')")
+    @Log(title = "工单收费详情", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody ChargeDetails chargeDetails)
+    {
+        return toAjax(chargeDetailsService.updateChargeDetails(chargeDetails));
+    }
+
+    /**
+     * 删除工单收费详情
+     */
+    @PreAuthorize("@ss.hasPermi('charge:details:remove')")
+    @Log(title = "工单收费详情", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(chargeDetailsService.deleteChargeDetailsByIds(ids));
+    }
+}

+ 104 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/work/WorkOrderFjController.java

@@ -0,0 +1,104 @@
+package com.ruoyi.web.controller.work;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+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.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.WorkOrderFj;
+import com.ruoyi.system.service.IWorkOrderFjService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 工单_附件Controller
+ * 
+ * @author ruoyi
+ * @date 2025-05-12
+ */
+@RestController
+@RequestMapping("/work/fj")
+public class WorkOrderFjController extends BaseController
+{
+    @Autowired
+    private IWorkOrderFjService workOrderFjService;
+
+    /**
+     * 查询工单_附件列表
+     */
+    @PreAuthorize("@ss.hasPermi('work:fj:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(WorkOrderFj workOrderFj)
+    {
+        startPage();
+        List<WorkOrderFj> list = workOrderFjService.selectWorkOrderFjList(workOrderFj);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出工单_附件列表
+     */
+    @PreAuthorize("@ss.hasPermi('work:fj:export')")
+    @Log(title = "工单_附件", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, WorkOrderFj workOrderFj)
+    {
+        List<WorkOrderFj> list = workOrderFjService.selectWorkOrderFjList(workOrderFj);
+        ExcelUtil<WorkOrderFj> util = new ExcelUtil<WorkOrderFj>(WorkOrderFj.class);
+        util.exportExcel(response, list, "工单_附件数据");
+    }
+
+    /**
+     * 获取工单_附件详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('work:fj:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(workOrderFjService.selectWorkOrderFjById(id));
+    }
+
+    /**
+     * 新增工单_附件
+     */
+    @PreAuthorize("@ss.hasPermi('work:fj:add')")
+    @Log(title = "工单_附件", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody WorkOrderFj workOrderFj)
+    {
+        return toAjax(workOrderFjService.insertWorkOrderFj(workOrderFj));
+    }
+
+    /**
+     * 修改工单_附件
+     */
+    @PreAuthorize("@ss.hasPermi('work:fj:edit')")
+    @Log(title = "工单_附件", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody WorkOrderFj workOrderFj)
+    {
+        return toAjax(workOrderFjService.updateWorkOrderFj(workOrderFj));
+    }
+
+    /**
+     * 删除工单_附件
+     */
+    @PreAuthorize("@ss.hasPermi('work:fj:remove')")
+    @Log(title = "工单_附件", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(workOrderFjService.deleteWorkOrderFjByIds(ids));
+    }
+}

+ 217 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/work/WorkOrderInfoController.java

@@ -0,0 +1,217 @@
+package com.ruoyi.web.controller.work;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.system.domain.vo.WordVo;
+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.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.WorkOrderInfo;
+import com.ruoyi.system.service.IWorkOrderInfoService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 工单信息Controller
+ * 
+ * @author ruoyi
+ * @date 2025-05-12
+ */
+@RestController
+@RequestMapping("/work/info")
+public class WorkOrderInfoController extends BaseController
+{
+    @Autowired
+    private IWorkOrderInfoService workOrderInfoService;
+
+    /**
+     * 查询工单信息列表
+     */
+    @PreAuthorize("@ss.hasPermi('work:info:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(WorkOrderInfo workOrderInfo)
+    {
+        startPage();
+        List<WorkOrderInfo> list = workOrderInfoService.selectWorkOrderInfoList(workOrderInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出工单信息列表
+     */
+    @PreAuthorize("@ss.hasPermi('work:info:export')")
+    @Log(title = "工单信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, WorkOrderInfo workOrderInfo)
+    {
+        List<WorkOrderInfo> list = workOrderInfoService.selectWorkOrderInfoList(workOrderInfo);
+        ExcelUtil<WorkOrderInfo> util = new ExcelUtil<WorkOrderInfo>(WorkOrderInfo.class);
+        util.exportExcel(response, list, "工单信息数据");
+    }
+
+    /**
+     * 获取工单信息详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('work:info:query')")
+    @GetMapping(value = "/{orderId}")
+    public AjaxResult getInfo(@PathVariable("orderId") String orderId)
+    {
+        return success(workOrderInfoService.selectWorkOrderInfoByOrderId(orderId));
+    }
+
+    /**
+     * 新增工单信息
+     */
+    @PreAuthorize("@ss.hasPermi('work:info:add')")
+    @Log(title = "工单信息", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody WorkOrderInfo workOrderInfo)
+    {
+        return toAjax(workOrderInfoService.insertWorkOrderInfo(workOrderInfo));
+    }
+
+    /**
+     * 修改工单信息
+     */
+    @PreAuthorize("@ss.hasPermi('work:info:edit')")
+    @Log(title = "工单信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody WorkOrderInfo workOrderInfo)
+    {
+        return toAjax(workOrderInfoService.updateWorkOrderInfo(workOrderInfo));
+    }
+
+    /**
+     * 工单信息接单
+     */
+    @PreAuthorize("@ss.hasPermi('work:info:jd')")
+    @Log(title = "工单信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/jd")
+    public AjaxResult jd(@RequestBody WorkOrderInfo workOrderInfo)
+    {
+        return toAjax(workOrderInfoService.jd(workOrderInfo));
+    }
+
+    /**
+     * 删除工单信息
+     */
+    @PreAuthorize("@ss.hasPermi('work:info:remove')")
+    @Log(title = "工单信息", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{orderIds}")
+    public AjaxResult remove(@PathVariable String[] orderIds)
+    {
+        return toAjax(workOrderInfoService.deleteWorkOrderInfoByOrderIds(orderIds));
+    }
+
+    /**
+     * 生成电子工单
+     */
+    @PreAuthorize("@ss.hasPermi('work:info:dz')")
+    @GetMapping(value = "/dzgd/{orderId}")
+    public AjaxResult dzgd(@PathVariable("orderId") String orderId)
+    {
+        return workOrderInfoService.dzgd(orderId);
+    }
+
+    /**
+     * 签名
+     */
+    @PreAuthorize("@ss.hasPermi('work:info:qm')")
+    @PostMapping(value = "/dzgd/qm")
+    public AjaxResult qm(@RequestBody WordVo wordVo)
+    {
+        return workOrderInfoService.qm(wordVo);
+    }
+
+    /**
+     * pc首页本月工单统计(流程)
+     */
+    @PreAuthorize("@ss.hasPermi('work:statistics:lc')")
+    @GetMapping(value = "/statistics/lc")
+    public AjaxResult lc()
+    {
+        return workOrderInfoService.lc();
+    }
+
+    /**
+     * pc首页本月工单统计(服务)
+     */
+    @PreAuthorize("@ss.hasPermi('work:statistics:fw')")
+    @GetMapping(value = "/statistics/fw")
+    public AjaxResult fw()
+    {
+        return workOrderInfoService.fw();
+    }
+
+    /**
+     * pc首页较上月工单统计(服务)
+     */
+    @PreAuthorize("@ss.hasPermi('work:statistics:bj')")
+    @GetMapping(value = "/statistics/bj")
+    public AjaxResult bj()
+    {
+        return workOrderInfoService.bj();
+    }
+
+    /**
+     * pc首页top6员工(月)
+     */
+    @PreAuthorize("@ss.hasPermi('work:month:px')")
+    @GetMapping(value = "/month/px")
+    public AjaxResult monthPx(String time)
+    {
+        return workOrderInfoService.monthPx(time);
+    }
+
+    /**
+     * app首页top6员工(年)
+     */
+    @PreAuthorize("@ss.hasPermi('work:year:px')")
+    @GetMapping(value = "/year/px")
+    public AjaxResult yearPx(String time)
+    {
+        return workOrderInfoService.yearPx(time);
+    }
+
+    /**
+     * app服务类型单量统计(年)
+     */
+    @PreAuthorize("@ss.hasPermi('work:year:fwlx')")
+    @GetMapping(value = "/year/fwlx")
+    public AjaxResult yearFwlx(String time)
+    {
+        return workOrderInfoService.yearFwlx(time);
+    }
+
+    /**
+     * APP首页季度个人接单统计
+     */
+    @PreAuthorize("@ss.hasPermi('work:statistics:jd')")
+    @GetMapping(value = "/statistics/jd")
+    public AjaxResult statisticsJd()
+    {
+        return workOrderInfoService.statisticsJd();
+    }
+
+    /**
+     * 待办事项数量
+     */
+    @PreAuthorize("@ss.hasPermi('work:db:num')")
+    @GetMapping(value = "/db/num")
+    public AjaxResult dbNum()
+    {
+        return workOrderInfoService.dbNum();
+    }
+}

+ 39 - 2
ruoyi-admin/src/main/resources/application-druid.yml

@@ -1,14 +1,51 @@
+# 项目相关配置
+ruoyi:
+    # 名称
+    name: 中新云工单
+    # 版本
+    version: 3.8.9
+    # 版权年份
+    copyrightYear: 2025
+    # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
+    profile: D:/ruoyi/uploadPath/gongdan
+    # 获取ip地址开关
+    addressEnabled: false
+    # 验证码类型 math 数字计算 char 字符验证
+    captchaType: math
+
 # 数据源配置
 spring:
+    # redis 配置
+    redis:
+        # 地址
+        host: 60.171.161.56
+        # 端口,默认为6379
+        port: 20001
+        # 数据库索引
+        database: 4
+        # 密码
+        password: Boman123
+        # 连接超时时间
+        timeout: 10s
+        lettuce:
+            pool:
+                # 连接池中的最小空闲连接
+                min-idle: 0
+                # 连接池中的最大空闲连接
+                max-idle: 8
+                # 连接池的最大数据库连接数
+                max-active: 8
+                # #连接池最大阻塞等待时间(使用负值表示没有限制)
+                max-wait: -1ms
     datasource:
         type: com.alibaba.druid.pool.DruidDataSource
         driverClassName: com.mysql.cj.jdbc.Driver
         druid:
             # 主库数据源
             master:
-                url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                url: jdbc:mysql://60.171.161.56:25143/gongdan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                 username: root
-                password: password
+                password: Boman123
             # 从库数据源
             slave:
                 # 从数据源开关/默认关闭

+ 105 - 0
ruoyi-admin/src/main/resources/application-prod.yml

@@ -0,0 +1,105 @@
+# 项目相关配置
+ruoyi:
+    # 名称
+    name: 中新云园区
+    # 版本
+    version: 3.8.7
+    # 版权年份
+    copyrightYear: 2025
+    # 实例演示开关
+    demoEnabled: true
+    # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
+    profile: /home/ruoyi/uploadPath/gongdan
+    # 获取ip地址开关
+    addressEnabled: false
+    # 验证码类型 math 数组计算 char 字符验证
+    captchaType: math
+
+
+# 数据源配置
+spring:
+    # redis 配置
+    redis:
+        # 地址
+        host: 127.0.0.1
+        # 端口,默认为6379
+        port: 6379
+        # 数据库索引
+        database: 4
+        # 密码
+        password: D3fQYAsw
+        # 连接超时时间
+        timeout: 10s
+        lettuce:
+            pool:
+                # 连接池中的最小空闲连接
+                min-idle: 0
+                # 连接池中的最大空闲连接
+                max-idle: 8
+                # 连接池的最大数据库连接数
+                max-active: 8
+                # #连接池最大阻塞等待时间(使用负值表示没有限制)
+                max-wait: -1ms
+
+    datasource:
+        type: com.alibaba.druid.pool.DruidDataSource
+        driverClassName: com.mysql.cj.jdbc.Driver
+        druid:
+            # 主库数据源
+            master:
+                url: jdbc:mysql://127.0.0.1:3306/gongdan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
+                username: root
+                password: zhaoshang@2018
+            # 从库数据源
+            slave:
+                # 从数据源开关/默认关闭
+                enabled: false
+                url:
+                username:
+                password:
+            # 初始连接数
+            initialSize: 5
+            # 最小连接池数量
+            minIdle: 10
+            # 最大连接池数量
+            maxActive: 20
+            # 配置获取连接等待超时的时间
+            maxWait: 60000
+            # 配置连接超时时间
+            connectTimeout: 30000
+            # 配置网络超时时间
+            socketTimeout: 60000
+            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+            timeBetweenEvictionRunsMillis: 60000
+            # 配置一个连接在池中最小生存的时间,单位是毫秒
+            minEvictableIdleTimeMillis: 300000
+            # 配置一个连接在池中最大生存的时间,单位是毫秒
+            maxEvictableIdleTimeMillis: 900000
+            # 配置检测连接是否有效
+            validationQuery: SELECT 1 FROM DUAL
+            testWhileIdle: true
+            testOnBorrow: false
+            testOnReturn: false
+            webStatFilter:
+                enabled: true
+            statViewServlet:
+                enabled: false
+                # 设置白名单,不填则允许所有访问
+                allow:
+                url-pattern: /druid/*
+                # 控制台管理用户名和密码
+                login-username:
+                login-password:
+            filter:
+                stat:
+                    enabled: true
+                    # 慢SQL记录
+                    log-slow-sql: true
+                    slow-sql-millis: 1000
+                    merge-sql: true
+                wall:
+                    config:
+                        multi-statement-allow: true
+
+
+#极光推送

+ 3 - 38
ruoyi-admin/src/main/resources/application.yml

@@ -1,22 +1,8 @@
-# 项目相关配置
-ruoyi:
-  # 名称
-  name: RuoYi
-  # 版本
-  version: 3.8.9
-  # 版权年份
-  copyrightYear: 2025
-  # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
-  profile: D:/ruoyi/uploadPath
-  # 获取ip地址开关
-  addressEnabled: false
-  # 验证码类型 math 数字计算 char 字符验证
-  captchaType: math
 
 # 开发环境配置
 server:
   # 服务器的HTTP端口,默认为8080
-  port: 8080
+  port: 8077
   servlet:
     # 应用的访问路径
     context-path: /
@@ -53,6 +39,7 @@ spring:
     basename: i18n/messages
   profiles:
     active: druid
+    #active: prod
   # 文件上传
   servlet:
     multipart:
@@ -65,28 +52,6 @@ spring:
     restart:
       # 热部署开关
       enabled: true
-  # redis 配置
-  redis:
-    # 地址
-    host: localhost
-    # 端口,默认为6379
-    port: 6379
-    # 数据库索引
-    database: 0
-    # 密码
-    password:
-    # 连接超时时间
-    timeout: 10s
-    lettuce:
-      pool:
-        # 连接池中的最小空闲连接
-        min-idle: 0
-        # 连接池中的最大空闲连接
-        max-idle: 8
-        # 连接池的最大数据库连接数
-        max-active: 8
-        # #连接池最大阻塞等待时间(使用负值表示没有限制)
-        max-wait: -1ms
 
 # token配置
 token:
@@ -95,7 +60,7 @@ token:
   # 令牌密钥
   secret: abcdefghijklmnopqrstuvwxyz
   # 令牌有效期(默认30分钟)
-  expireTime: 30
+  expireTime: 21600
 
 # MyBatis配置
 mybatis:

+ 7 - 0
ruoyi-common/pom.xml

@@ -119,6 +119,13 @@
             <artifactId>javax.servlet-api</artifactId>
         </dependency>
 
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 18 - 0
ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java

@@ -39,6 +39,9 @@ public class UserConstants
     /** 是否为系统默认(是) */
     public static final String YES = "Y";
 
+    /** 是否为系统默认(否) */
+    public static final String NO = "N";
+
     /** 是否菜单外链(是) */
     public static final String YES_FRAME = "0";
 
@@ -78,4 +81,19 @@ public class UserConstants
      */
     public static final int PASSWORD_MIN_LENGTH = 5;
     public static final int PASSWORD_MAX_LENGTH = 20;
+
+    /**
+     * 行政区域规划树形集合
+     */
+    public static final String CHINA_AREA = "china_area_list:";
+
+    public static final String ONE = "1";
+    public static final String TWO = "2";
+    public static final String THR = "3";
+    public static final String FOR = "4";
+    public static final String FIV = "5";
+    public static final String SIX = "6";
+
+    /** 接单员工 */
+    public final static String WORK_USER = "workUser";
 }

+ 2 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java

@@ -7,6 +7,7 @@ import java.util.Map;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
+import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * Entity基类
@@ -26,6 +27,7 @@ public class BaseEntity implements Serializable
 
     /** 创建时间 */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date createTime;
 
     /** 更新者 */

+ 8 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java

@@ -5,6 +5,7 @@ import java.util.List;
 import java.util.stream.Collectors;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.ruoyi.common.constant.UserConstants;
+import com.ruoyi.common.core.domain.entity.ChinaArea;
 import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.core.domain.entity.SysMenu;
 import com.ruoyi.common.utils.StringUtils;
@@ -51,6 +52,13 @@ public class TreeSelect implements Serializable
         this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
     }
 
+    public TreeSelect(ChinaArea chinaArea)
+    {
+        this.id = chinaArea.getId();
+        this.label = chinaArea.getName();
+        this.children = chinaArea.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
+    }
+
     public Long getId()
     {
         return id;

+ 137 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/ChinaArea.java

@@ -0,0 +1,137 @@
+package com.ruoyi.common.core.domain.entity;
+
+
+
+import com.ruoyi.common.core.domain.BaseEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author tjf
+ * @Date: 2022/03/25/9:41
+ */
+public class ChinaArea extends BaseEntity {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * id
+     */
+
+    private Long id;
+
+    /**
+     * 数据库字段id
+     */
+    private String areaId;
+
+    /**
+     * 上级ID,一级为0
+     */
+
+    private String pid;
+
+    /**
+     * 名称
+     */
+
+    private String name;
+
+    /**
+     * 层级
+     */
+
+    private Integer treeLevel;
+
+    /**
+     * 是否叶子节点  0:否   1:是
+     */
+
+    private Integer leaf;
+
+    /**
+     * 排序
+     */
+
+    private Long sort;
+
+    /** 子区域 */
+    private List<ChinaArea> children = new ArrayList<ChinaArea>();
+
+    public List<ChinaArea> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<ChinaArea> children) {
+        this.children = children;
+    }
+
+    public String getAreaId() {
+        return areaId;
+    }
+
+    public void setAreaId(String areaId) {
+        this.areaId = areaId;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getPid() {
+        return pid;
+    }
+
+    public void setPid(String pid) {
+        this.pid = pid;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getTreeLevel() {
+        return treeLevel;
+    }
+
+    public void setTreeLevel(Integer treeLevel) {
+        this.treeLevel = treeLevel;
+    }
+
+    public Integer getLeaf() {
+        return leaf;
+    }
+
+    public void setLeaf(Integer leaf) {
+        this.leaf = leaf;
+    }
+
+    public Long getSort() {
+        return sort;
+    }
+
+    public void setSort(Long sort) {
+        this.sort = sort;
+    }
+
+    @Override
+    public String toString() {
+        return "SysRegion{" +
+                "id=" + id +
+                ", pid=" + pid +
+                ", name='" + name + '\'' +
+                ", treeLevel=" + treeLevel +
+                ", leaf=" + leaf +
+                ", sort=" + sort +
+                '}';
+    }
+}

+ 102 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java

@@ -8,7 +8,10 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.ZoneId;
 import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.Date;
+import java.util.concurrent.ThreadLocalRandom;
+
 import org.apache.commons.lang3.time.DateFormatUtils;
 
 /**
@@ -188,4 +191,103 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
         return Date.from(zdt.toInstant());
     }
+
+    /**
+     * 时间戳+4位随机数
+     */
+    public static final String getOrderId()
+    {
+        // 获取当前时间戳
+        long timestamp = System.currentTimeMillis();
+
+        // 使用ThreadLocalRandom生成一个0到9999之间的随机数(包括0和9999)
+        int randomNumber = ThreadLocalRandom.current().nextInt(10000);
+
+        // 拼接时间戳和随机数,并确保随机数是4位数
+        String timestampWithRandom = timestamp + String.format("%04d", randomNumber);
+
+        return timestampWithRandom;
+    }
+
+    /**
+     * 获取上个月(年月)
+     */
+    public static final String lastMonth()
+    {
+        LocalDate currentDate = LocalDate.now();
+        LocalDate lastMonthDate = currentDate.minusMonths(1);
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(YYYY_MM);
+        String lastMonth = lastMonthDate.format(formatter);
+
+        return lastMonth;
+    }
+
+    /**
+     * 获取当前季度的开始日期
+     */
+    public static final String startQuarterly()
+    {
+        // 获取当前日期
+        LocalDate currentDate = LocalDate.now();
+
+        // 计算当前季度
+        int month = currentDate.getMonthValue();
+        int startMonth, endMonth;
+
+        if (month >= 1 && month <= 3) {
+            startMonth = 1;
+            endMonth = 3;
+        } else if (month >= 4 && month <= 6) {
+            startMonth = 4;
+            endMonth = 6;
+        } else if (month >= 7 && month <= 9) {
+            startMonth = 7;
+            endMonth = 9;
+        } else {
+            startMonth = 10;
+            endMonth = 12;
+        }
+
+        // 构建开始和结束日期
+        LocalDate startDate = LocalDate.of(currentDate.getYear(), startMonth, 1);
+        LocalDate endDate = LocalDate.of(currentDate.getYear(), endMonth,
+                endMonth == 6 || endMonth == 9 ? 30 : 31);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        return startDate.format(formatter);
+    }
+
+    /**
+     * 获取当前季度的结束日期
+     */
+    public static final String endQuarterly()
+    {
+        // 获取当前日期
+        LocalDate currentDate = LocalDate.now();
+
+        // 计算当前季度
+        int month = currentDate.getMonthValue();
+        int startMonth, endMonth;
+
+        if (month >= 1 && month <= 3) {
+            startMonth = 1;
+            endMonth = 3;
+        } else if (month >= 4 && month <= 6) {
+            startMonth = 4;
+            endMonth = 6;
+        } else if (month >= 7 && month <= 9) {
+            startMonth = 7;
+            endMonth = 9;
+        } else {
+            startMonth = 10;
+            endMonth = 12;
+        }
+
+        // 构建开始和结束日期
+        LocalDate startDate = LocalDate.of(currentDate.getYear(), startMonth, 1);
+        LocalDate endDate = LocalDate.of(currentDate.getYear(), endMonth,
+                endMonth == 6 || endMonth == 9 ? 30 : 31);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        return endDate.format(formatter);
+    }
 }

+ 79 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/base64/Base64DecodedMultipartFile.java

@@ -0,0 +1,79 @@
+package com.ruoyi.common.utils.base64;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+import java.util.Base64;
+
+/**
+ * @author 笑小枫
+ */
+public class Base64DecodedMultipartFile implements MultipartFile {
+    private final byte[] imgContent;
+    private final String header;
+    private final String fileName;
+
+    public Base64DecodedMultipartFile(byte[] imgContent, String header, String fileName) {
+        this.imgContent = imgContent;
+        this.header = header.split(";")[0];
+        this.fileName = fileName;
+    }
+
+    @Override
+    public String getName() {
+        return fileName + "." + header.split("/")[1];
+    }
+
+    @Override
+    public String getOriginalFilename() {
+        return fileName + "." + header.split("/")[1];
+    }
+
+    @Override
+    public String getContentType() {
+        return header.split(":")[1];
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return imgContent == null || imgContent.length == 0;
+    }
+
+    @Override
+    public long getSize() {
+        return imgContent.length;
+    }
+
+    @Override
+    public byte[] getBytes() {
+        return imgContent;
+    }
+
+    @Override
+    public InputStream getInputStream() {
+        return new ByteArrayInputStream(imgContent);
+    }
+
+    @Override
+    public void transferTo(File dest) throws IOException, IllegalStateException {
+        try (FileOutputStream fos = new FileOutputStream(dest)) {
+            fos.write(imgContent);
+        }
+    }
+
+    /**
+     * base64转multipartFile
+     **/
+    public static MultipartFile base64Convert(String base64, String header, String fileName) {
+        Base64.Decoder decoder = Base64.getDecoder();
+        byte[] b = decoder.decode(base64);
+        //取索引为1的元素进行处理
+        for (int i = 0; i < b.length; ++i) {
+            if (b[i] < 0) {
+                b[i] += 256;
+            }
+        }
+        // 处理过后的数据通过Base64DecodeMultipartFile转换为MultipartFile对象
+        return new Base64DecodedMultipartFile(b, header, fileName);
+    }
+}

+ 1 - 1
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java

@@ -111,7 +111,7 @@ public class SecurityConfig
             .authorizeHttpRequests((requests) -> {
                 permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll());
                 // 对于登录login 注册register 验证码captchaImage 允许匿名访问
-                requests.antMatchers("/login", "/register", "/captchaImage").permitAll()
+                requests.antMatchers("/login", "/register", "/captchaImage","/work/info/dzgd/**").permitAll()
                     // 静态资源,可匿名访问
                     .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                     .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()

+ 1 - 1
ruoyi-generator/src/main/resources/generator.yml

@@ -1,7 +1,7 @@
 # 代码生成
 gen:
   # 作者
-  author: ruoyi
+  author: boman
   # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
   packageName: com.ruoyi.system
   # 自动去除表前缀,默认是false

+ 2 - 2
ruoyi-generator/src/main/resources/vm/java/controller.java.vm

@@ -96,7 +96,7 @@ public class ${ClassName}Controller extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')")
     @Log(title = "${functionName}", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PostMapping("/put")
     public AjaxResult edit(@RequestBody ${ClassName} ${className})
     {
         return toAjax(${className}Service.update${ClassName}(${className}));
@@ -107,7 +107,7 @@ public class ${ClassName}Controller extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('${permissionPrefix}:remove')")
     @Log(title = "${functionName}", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{${pkColumn.javaField}s}")
+    @GetMapping("/delete/{${pkColumn.javaField}s}")
     public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s)
     {
         return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s));

+ 24 - 0
ruoyi-system/pom.xml

@@ -23,6 +23,30 @@
             <artifactId>ruoyi-common</artifactId>
         </dependency>
 
+        <!--    POI 依赖 使用xlsx xml的格式(即XSSFWorkbook)   -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>5.2.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-scratchpad</artifactId>
+            <version>3.17</version>
+        </dependency>
+        <!--     poi模板导入,主力包      -->
+        <dependency>
+            <groupId>com.deepoove</groupId>
+            <artifactId>poi-tl</artifactId>
+            <version>1.12.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 265 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/BasicInfo.java

@@ -0,0 +1,265 @@
+package com.ruoyi.system.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 基本信息对象 basic_info
+ * 
+ * @author ruoyi
+ * @date 2025-05-12
+ */
+public class BasicInfo extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** ID */
+    private Long id;
+
+    /** 用户ID */
+    @Excel(name = "用户ID")
+    private Long userId;
+
+    /** 单位名称 */
+    @Excel(name = "单位名称")
+    private String unitName;
+
+    /** 居住地的省份 */
+    private String provinceId;
+
+    /** 居住地的省份 */
+    @Excel(name = "居住地的省份")
+    private String province;
+
+    /** 居住地的城市 */
+    private String cityId;
+
+    /** 居住地的城市 */
+    @Excel(name = "居住地的城市")
+    private String city;
+
+    /** 居住地的区 */
+    private String regionId;
+
+    /** 居住地的区 */
+    @Excel(name = "居住地的区")
+    private String region;
+
+    /** 详细地址 */
+    @Excel(name = "详细地址")
+    private String detailedAddress;
+
+    /** 经度 */
+    @Excel(name = "经度")
+    private String lon;
+
+    /** 纬度 */
+    @Excel(name = "纬度")
+    private String lat;
+
+    /** 联系人 */
+    @Excel(name = "联系人")
+    private String personName;
+
+    /** 联系电话 */
+    @Excel(name = "联系电话")
+    private String phonenumber;
+
+    /** 性别(0男 1女 2未知) */
+    @Excel(name = "性别", readConverterExp = "0=男,1=女,2=未知")
+    private String sex;
+
+    /** 删除标志(0代表存在 2代表删除) */
+    private String delFlag;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+
+    public void setUserId(Long userId) 
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId() 
+    {
+        return userId;
+    }
+
+    public void setUnitName(String unitName) 
+    {
+        this.unitName = unitName;
+    }
+
+    public String getUnitName() 
+    {
+        return unitName;
+    }
+
+    public void setProvinceId(String provinceId) 
+    {
+        this.provinceId = provinceId;
+    }
+
+    public String getProvinceId() 
+    {
+        return provinceId;
+    }
+
+    public void setProvince(String province) 
+    {
+        this.province = province;
+    }
+
+    public String getProvince() 
+    {
+        return province;
+    }
+
+    public void setCityId(String cityId) 
+    {
+        this.cityId = cityId;
+    }
+
+    public String getCityId() 
+    {
+        return cityId;
+    }
+
+    public void setCity(String city) 
+    {
+        this.city = city;
+    }
+
+    public String getCity() 
+    {
+        return city;
+    }
+
+    public void setRegionId(String regionId) 
+    {
+        this.regionId = regionId;
+    }
+
+    public String getRegionId() 
+    {
+        return regionId;
+    }
+
+    public void setRegion(String region) 
+    {
+        this.region = region;
+    }
+
+    public String getRegion() 
+    {
+        return region;
+    }
+
+    public void setDetailedAddress(String detailedAddress) 
+    {
+        this.detailedAddress = detailedAddress;
+    }
+
+    public String getDetailedAddress() 
+    {
+        return detailedAddress;
+    }
+
+    public void setLon(String lon) 
+    {
+        this.lon = lon;
+    }
+
+    public String getLon() 
+    {
+        return lon;
+    }
+
+    public void setLat(String lat) 
+    {
+        this.lat = lat;
+    }
+
+    public String getLat() 
+    {
+        return lat;
+    }
+
+    public void setPersonName(String personName) 
+    {
+        this.personName = personName;
+    }
+
+    public String getPersonName() 
+    {
+        return personName;
+    }
+
+    public void setPhonenumber(String phonenumber) 
+    {
+        this.phonenumber = phonenumber;
+    }
+
+    public String getPhonenumber() 
+    {
+        return phonenumber;
+    }
+
+    public void setSex(String sex) 
+    {
+        this.sex = sex;
+    }
+
+    public String getSex() 
+    {
+        return sex;
+    }
+
+    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("userId", getUserId())
+            .append("unitName", getUnitName())
+            .append("provinceId", getProvinceId())
+            .append("province", getProvince())
+            .append("cityId", getCityId())
+            .append("city", getCity())
+            .append("regionId", getRegionId())
+            .append("region", getRegion())
+            .append("detailedAddress", getDetailedAddress())
+            .append("lon", getLon())
+            .append("lat", getLat())
+            .append("personName", getPersonName())
+            .append("phonenumber", getPhonenumber())
+            .append("sex", getSex())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 127 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/ChargeDetails.java

@@ -0,0 +1,127 @@
+package com.ruoyi.system.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 工单收费详情对象 charge_details
+ * 
+ * @author ruoyi
+ * @date 2025-05-12
+ */
+public class ChargeDetails extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** ID */
+    private Long id;
+
+    /** 工单ID */
+    @Excel(name = "工单ID")
+    private String orderId;
+
+    /** 产品名称 */
+    @Excel(name = "产品名称")
+    private String productName;
+
+    /** 产品数量 */
+    @Excel(name = "产品数量")
+    private Long productNum;
+
+    /** 产品单位 */
+    @Excel(name = "产品单位")
+    private String productUnit;
+
+    /** 含税单价 */
+    @Excel(name = "含税单价")
+    private String unitPrice;
+
+    /** 含税总价 */
+    @Excel(name = "含税总价")
+    private String totalPrice;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+
+    public void setOrderId(String orderId) 
+    {
+        this.orderId = orderId;
+    }
+
+    public String getOrderId() 
+    {
+        return orderId;
+    }
+
+    public void setProductName(String productName) 
+    {
+        this.productName = productName;
+    }
+
+    public String getProductName() 
+    {
+        return productName;
+    }
+
+    public void setProductNum(Long productNum) 
+    {
+        this.productNum = productNum;
+    }
+
+    public Long getProductNum() 
+    {
+        return productNum;
+    }
+
+    public void setProductUnit(String productUnit) 
+    {
+        this.productUnit = productUnit;
+    }
+
+    public String getProductUnit() 
+    {
+        return productUnit;
+    }
+
+    public void setUnitPrice(String unitPrice) 
+    {
+        this.unitPrice = unitPrice;
+    }
+
+    public String getUnitPrice() 
+    {
+        return unitPrice;
+    }
+
+    public void setTotalPrice(String totalPrice) 
+    {
+        this.totalPrice = totalPrice;
+    }
+
+    public String getTotalPrice() 
+    {
+        return totalPrice;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("orderId", getOrderId())
+            .append("productName", getProductName())
+            .append("productNum", getProductNum())
+            .append("productUnit", getProductUnit())
+            .append("unitPrice", getUnitPrice())
+            .append("totalPrice", getTotalPrice())
+            .toString();
+    }
+}

+ 116 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/OperationRecord.java

@@ -0,0 +1,116 @@
+package com.ruoyi.system.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 操作记录对象 operation_record
+ * 
+ * @author boman
+ * @date 2025-05-16
+ */
+public class OperationRecord extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** ID */
+    private Long id;
+
+    /** 工单ID */
+    @Excel(name = "工单ID")
+    private String orderId;
+
+    /** 创建人id */
+    @Excel(name = "创建人id")
+    private Long userId;
+
+    /** 创建人姓名 */
+    @Excel(name = "创建人姓名")
+    private String userName;
+
+    /** 操作描述 */
+    @Excel(name = "操作描述")
+    private String record;
+
+    /** 删除标志(N代表存在 Y代表删除) */
+    private String delFlag;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+
+    public void setOrderId(String orderId) 
+    {
+        this.orderId = orderId;
+    }
+
+    public String getOrderId() 
+    {
+        return orderId;
+    }
+
+    public void setUserId(Long userId) 
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId() 
+    {
+        return userId;
+    }
+
+    public void setUserName(String userName) 
+    {
+        this.userName = userName;
+    }
+
+    public String getUserName() 
+    {
+        return userName;
+    }
+
+    public void setRecord(String record) 
+    {
+        this.record = record;
+    }
+
+    public String getRecord() 
+    {
+        return record;
+    }
+
+    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("orderId", getOrderId())
+            .append("userId", getUserId())
+            .append("userName", getUserName())
+            .append("record", getRecord())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 98 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/WorkOrderFj.java

@@ -0,0 +1,98 @@
+package com.ruoyi.system.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 工单_附件对象 work_order_fj
+ * 
+ * @author ruoyi
+ * @date 2025-05-12
+ */
+public class WorkOrderFj extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 附件ID */
+    private Long id;
+
+    /** 工单id */
+    @Excel(name = "工单id")
+    private String orderId;
+
+    /** 附件名称 */
+    @Excel(name = "附件名称")
+    private String name;
+
+    /** 附件地址 */
+    @Excel(name = "附件地址")
+    private String url;
+
+    /** 附件类型 1:需求附件,2:签名 */
+    @Excel(name = "附件类型 1:需求附件,2:签名")
+    private String type;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+
+    public void setOrderId(String orderId) 
+    {
+        this.orderId = orderId;
+    }
+
+    public String getOrderId() 
+    {
+        return orderId;
+    }
+
+    public void setName(String name) 
+    {
+        this.name = name;
+    }
+
+    public String getName() 
+    {
+        return name;
+    }
+
+    public void setUrl(String url) 
+    {
+        this.url = url;
+    }
+
+    public String getUrl() 
+    {
+        return url;
+    }
+
+    public void setType(String type) 
+    {
+        this.type = type;
+    }
+
+    public String getType() 
+    {
+        return type;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("orderId", getOrderId())
+            .append("name", getName())
+            .append("url", getUrl())
+            .append("type", getType())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 579 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/WorkOrderInfo.java

@@ -0,0 +1,579 @@
+package com.ruoyi.system.domain;
+
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 工单信息对象 work_order_info
+ * 
+ * @author ruoyi
+ * @date 2025-05-12
+ */
+public class WorkOrderInfo extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 工单ID */
+    private String orderId;
+
+    /** 用户ID */
+    private Long userId;
+
+    /** 创建人姓名 */
+    @Excel(name = "创建人姓名")
+    private String userName;
+
+    /** 单位名称 */
+    @Excel(name = "单位名称")
+    private String unitName;
+
+    /** 居住地的省份 */
+    @Excel(name = "居住地的省份")
+    private String provinceId;
+
+    /** 居住地的省份 */
+    @Excel(name = "居住地的省份")
+    private String province;
+
+    /** 居住地的城市 */
+    @Excel(name = "居住地的城市")
+    private String cityId;
+
+    /** 居住地的城市 */
+    @Excel(name = "居住地的城市")
+    private String city;
+
+    /** 居住地的区 */
+    @Excel(name = "居住地的区")
+    private String regionId;
+
+    /** 居住地的区 */
+    @Excel(name = "居住地的区")
+    private String region;
+
+    /** 详细地址 */
+    @Excel(name = "详细地址")
+    private String detailedAddress;
+
+    /** 经度 */
+    @Excel(name = "经度")
+    private String lon;
+
+    /** 纬度 */
+    @Excel(name = "纬度")
+    private String lat;
+
+    /** 联系人 */
+    @Excel(name = "联系人")
+    private String personName;
+
+    /** 联系电话 */
+    @Excel(name = "联系电话")
+    private String phonenumber;
+
+    /** 性别(0男 1女 2未知) */
+    @Excel(name = "性别", readConverterExp = "0=男,1=女,2=未知")
+    private String sex;
+
+    /** 工单类型(1:网络服务,2:设备服务,3:软件服务,4:开发服务,5:设计服务,6:其他服务) */
+    @Excel(name = "工单类型", readConverterExp = "1=网络服务,2=设备服务,3=软件服务,4=开发服务,5=设计服务,6=其他服务")
+    private String type;
+
+    /** 客户需求 */
+    @Excel(name = "客户需求")
+    private String demand;
+
+    /** 是否签名(Y是 N否) */
+    @Excel(name = "是否签名", readConverterExp = "Y=是,N=否")
+    private String isSignature;
+
+    /** 是否满意(0:未评价,1:满意 ,2:不满意) */
+    @Excel(name = "是否满意", readConverterExp = "0=未评价,1=满意,,=2=不满意")
+    private String evaluation;
+
+    /** 评价内容 */
+    @Excel(name = "评价内容")
+    private String evaluationContent;
+
+    /** 服务进展(0:待接单,1:进行中 ,2:已完成,3:已评价) */
+    @Excel(name = "服务进展", readConverterExp = "0=待接单,1=进行中,2=已完成,3=已评价")
+    private String serviceProgress;
+
+    /** 售前还是售后(1:售前,2:售后) */
+    @Excel(name = "售前还是售后", readConverterExp = "1=售前,2=售后")
+    private String serviceType;
+
+    /** 派单情况(1:系统派单,2:自主接单) */
+    @Excel(name = "派单情况", readConverterExp = "1=系统派单,2=自主接单")
+    private String orderPlacement;
+
+    private String agency;
+
+    /** 责任人id */
+    @Excel(name = "责任人id")
+    private Long responsibleId;
+
+    /** 责任人姓名 */
+    @Excel(name = "责任人姓名")
+    private String responsibleName;
+
+    /** 责任人手机号 */
+    @Excel(name = "责任人手机号")
+    private String responsiblePhone;
+
+    /** 责任人姓名 */
+    @Excel(name = "接单时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date takeTime;
+
+    /** 项目名称 */
+    @Excel(name = "项目名称")
+    private String projectName;
+
+    /** 保质期(1:内,2外) */
+    @Excel(name = "保质期", readConverterExp = "1=内,2=外")
+    private String shelfLife;
+
+    /** 是否收费(Y是 N否) */
+    @Excel(name = "是否收费", readConverterExp = "Y=是,N=否")
+    private String isCharge;
+
+    /** 总费用 */
+    @Excel(name = "总费用")
+    private String totalCost;
+
+    /** 总费用(中文) */
+    @Excel(name = "总费用(中文)")
+    private String totalCostDx;
+
+    /** 删除标志(0代表存在 2代表删除) */
+    private String delFlag;
+
+    /** 电子工单 */
+    private WorkOrderFj workOrderFjgd;
+
+    /** 需求附件 */
+    private List<WorkOrderFj> workOrderFjXqList;
+
+    /** 签名 */
+    private List<WorkOrderFj> workOrderFjQmList;
+
+    private List<ChargeDetails> chargeDetailsList;
+
+
+    public void setOrderId(String orderId) 
+    {
+        this.orderId = orderId;
+    }
+
+    public String getOrderId() 
+    {
+        return orderId;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public void setUnitName(String unitName)
+    {
+        this.unitName = unitName;
+    }
+
+    public String getUnitName() 
+    {
+        return unitName;
+    }
+
+    public void setProvinceId(String provinceId) 
+    {
+        this.provinceId = provinceId;
+    }
+
+    public String getProvinceId() 
+    {
+        return provinceId;
+    }
+
+    public void setProvince(String province) 
+    {
+        this.province = province;
+    }
+
+    public String getProvince() 
+    {
+        return province;
+    }
+
+    public void setCityId(String cityId) 
+    {
+        this.cityId = cityId;
+    }
+
+    public String getCityId() 
+    {
+        return cityId;
+    }
+
+    public void setCity(String city) 
+    {
+        this.city = city;
+    }
+
+    public String getCity() 
+    {
+        return city;
+    }
+
+    public void setRegionId(String regionId) 
+    {
+        this.regionId = regionId;
+    }
+
+    public String getRegionId() 
+    {
+        return regionId;
+    }
+
+    public void setRegion(String region) 
+    {
+        this.region = region;
+    }
+
+    public String getRegion() 
+    {
+        return region;
+    }
+
+    public void setDetailedAddress(String detailedAddress) 
+    {
+        this.detailedAddress = detailedAddress;
+    }
+
+    public String getDetailedAddress() 
+    {
+        return detailedAddress;
+    }
+
+    public void setLon(String lon) 
+    {
+        this.lon = lon;
+    }
+
+    public String getLon() 
+    {
+        return lon;
+    }
+
+    public void setLat(String lat) 
+    {
+        this.lat = lat;
+    }
+
+    public String getLat() 
+    {
+        return lat;
+    }
+
+    public void setPersonName(String personName) 
+    {
+        this.personName = personName;
+    }
+
+    public String getPersonName() 
+    {
+        return personName;
+    }
+
+    public void setPhonenumber(String phonenumber) 
+    {
+        this.phonenumber = phonenumber;
+    }
+
+    public String getPhonenumber() 
+    {
+        return phonenumber;
+    }
+
+    public void setSex(String sex) 
+    {
+        this.sex = sex;
+    }
+
+    public String getSex() 
+    {
+        return sex;
+    }
+
+    public void setType(String type) 
+    {
+        this.type = type;
+    }
+
+    public String getType() 
+    {
+        return type;
+    }
+
+    public void setDemand(String demand) 
+    {
+        this.demand = demand;
+    }
+
+    public String getDemand() 
+    {
+        return demand;
+    }
+
+    public void setIsSignature(String isSignature) 
+    {
+        this.isSignature = isSignature;
+    }
+
+    public String getIsSignature() 
+    {
+        return isSignature;
+    }
+
+    public void setEvaluation(String evaluation) 
+    {
+        this.evaluation = evaluation;
+    }
+
+    public String getEvaluation() 
+    {
+        return evaluation;
+    }
+
+    public void setEvaluationContent(String evaluationContent) 
+    {
+        this.evaluationContent = evaluationContent;
+    }
+
+    public String getEvaluationContent() 
+    {
+        return evaluationContent;
+    }
+
+    public void setServiceProgress(String serviceProgress) 
+    {
+        this.serviceProgress = serviceProgress;
+    }
+
+    public String getServiceProgress() 
+    {
+        return serviceProgress;
+    }
+
+    public void setOrderPlacement(String orderPlacement) 
+    {
+        this.orderPlacement = orderPlacement;
+    }
+
+    public String getOrderPlacement() 
+    {
+        return orderPlacement;
+    }
+
+    public void setResponsibleId(Long responsibleId) 
+    {
+        this.responsibleId = responsibleId;
+    }
+
+    public Long getResponsibleId() 
+    {
+        return responsibleId;
+    }
+
+    public void setResponsibleName(String responsibleName) 
+    {
+        this.responsibleName = responsibleName;
+    }
+
+    public String getResponsibleName() 
+    {
+        return responsibleName;
+    }
+
+    public void setProjectName(String projectName) 
+    {
+        this.projectName = projectName;
+    }
+
+    public String getProjectName() 
+    {
+        return projectName;
+    }
+
+    public void setShelfLife(String shelfLife) 
+    {
+        this.shelfLife = shelfLife;
+    }
+
+    public String getShelfLife() 
+    {
+        return shelfLife;
+    }
+
+    public void setIsCharge(String isCharge) 
+    {
+        this.isCharge = isCharge;
+    }
+
+    public String getIsCharge() 
+    {
+        return isCharge;
+    }
+
+    public void setTotalCost(String totalCost) 
+    {
+        this.totalCost = totalCost;
+    }
+
+    public String getTotalCost() 
+    {
+        return totalCost;
+    }
+
+    public void setTotalCostDx(String totalCostDx) 
+    {
+        this.totalCostDx = totalCostDx;
+    }
+
+    public String getTotalCostDx() 
+    {
+        return totalCostDx;
+    }
+
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getResponsiblePhone() {
+        return responsiblePhone;
+    }
+
+    public void setResponsiblePhone(String responsiblePhone) {
+        this.responsiblePhone = responsiblePhone;
+    }
+
+    public List<WorkOrderFj> getWorkOrderFjXqList() {
+        return workOrderFjXqList;
+    }
+
+    public void setWorkOrderFjXqList(List<WorkOrderFj> workOrderFjXqList) {
+        this.workOrderFjXqList = workOrderFjXqList;
+    }
+
+    public List<WorkOrderFj> getWorkOrderFjQmList() {
+        return workOrderFjQmList;
+    }
+
+    public void setWorkOrderFjQmList(List<WorkOrderFj> workOrderFjQmList) {
+        this.workOrderFjQmList = workOrderFjQmList;
+    }
+
+    public List<ChargeDetails> getChargeDetailsList() {
+        return chargeDetailsList;
+    }
+
+    public void setChargeDetailsList(List<ChargeDetails> chargeDetailsList) {
+        this.chargeDetailsList = chargeDetailsList;
+    }
+
+    public String getDelFlag()
+    {
+        return delFlag;
+    }
+
+    public Date getTakeTime() {
+        return takeTime;
+    }
+
+    public void setTakeTime(Date takeTime) {
+        this.takeTime = takeTime;
+    }
+
+    public String getServiceType() {
+        return serviceType;
+    }
+
+    public void setServiceType(String serviceType) {
+        this.serviceType = serviceType;
+    }
+
+    public WorkOrderFj getWorkOrderFjgd() {
+        return workOrderFjgd;
+    }
+
+    public void setWorkOrderFjgd(WorkOrderFj workOrderFjgd) {
+        this.workOrderFjgd = workOrderFjgd;
+    }
+
+    public String getAgency() {
+        return agency;
+    }
+
+    public void setAgency(String agency) {
+        this.agency = agency;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("orderId", getOrderId())
+            .append("unitName", getUnitName())
+            .append("provinceId", getProvinceId())
+            .append("province", getProvince())
+            .append("cityId", getCityId())
+            .append("city", getCity())
+            .append("regionId", getRegionId())
+            .append("region", getRegion())
+            .append("detailedAddress", getDetailedAddress())
+            .append("lon", getLon())
+            .append("lat", getLat())
+            .append("personName", getPersonName())
+            .append("phonenumber", getPhonenumber())
+            .append("sex", getSex())
+            .append("type", getType())
+            .append("demand", getDemand())
+            .append("isSignature", getIsSignature())
+            .append("evaluation", getEvaluation())
+            .append("evaluationContent", getEvaluationContent())
+            .append("serviceProgress", getServiceProgress())
+            .append("orderPlacement", getOrderPlacement())
+            .append("responsibleId", getResponsibleId())
+            .append("responsibleName", getResponsibleName())
+            .append("projectName", getProjectName())
+            .append("shelfLife", getShelfLife())
+            .append("isCharge", getIsCharge())
+            .append("totalCost", getTotalCost())
+            .append("totalCostDx", getTotalCostDx())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 29 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/WordVo.java

@@ -0,0 +1,29 @@
+package com.ruoyi.system.domain.vo;
+
+
+public class WordVo {
+    /**
+     * word 文档路径
+     */
+    private String orderId;
+    /**
+     * 签名base64
+     */
+    private String image;
+
+    public String getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(String orderId) {
+        this.orderId = orderId;
+    }
+
+    public String getImage() {
+        return image;
+    }
+
+    public void setImage(String image) {
+        this.image = image;
+    }
+}

+ 61 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/BasicInfoMapper.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.ruoyi.system.domain.BasicInfo;
+
+/**
+ * 基本信息Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2025-05-12
+ */
+public interface BasicInfoMapper 
+{
+    /**
+     * 查询基本信息
+     * 
+     * @param id 基本信息主键
+     * @return 基本信息
+     */
+    public BasicInfo selectBasicInfoById(Long id);
+
+    /**
+     * 查询基本信息列表
+     * 
+     * @param basicInfo 基本信息
+     * @return 基本信息集合
+     */
+    public List<BasicInfo> selectBasicInfoList(BasicInfo basicInfo);
+
+    /**
+     * 新增基本信息
+     * 
+     * @param basicInfo 基本信息
+     * @return 结果
+     */
+    public int insertBasicInfo(BasicInfo basicInfo);
+
+    /**
+     * 修改基本信息
+     * 
+     * @param basicInfo 基本信息
+     * @return 结果
+     */
+    public int updateBasicInfo(BasicInfo basicInfo);
+
+    /**
+     * 删除基本信息
+     * 
+     * @param id 基本信息主键
+     * @return 结果
+     */
+    public int deleteBasicInfoById(Long id);
+
+    /**
+     * 批量删除基本信息
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteBasicInfoByIds(Long[] ids);
+}

+ 63 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/ChargeDetailsMapper.java

@@ -0,0 +1,63 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.ruoyi.system.domain.ChargeDetails;
+
+/**
+ * 工单收费详情Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2025-05-12
+ */
+public interface ChargeDetailsMapper 
+{
+    /**
+     * 查询工单收费详情
+     * 
+     * @param id 工单收费详情主键
+     * @return 工单收费详情
+     */
+    public ChargeDetails selectChargeDetailsById(Long id);
+
+    /**
+     * 查询工单收费详情列表
+     * 
+     * @param chargeDetails 工单收费详情
+     * @return 工单收费详情集合
+     */
+    public List<ChargeDetails> selectChargeDetailsList(ChargeDetails chargeDetails);
+
+    /**
+     * 新增工单收费详情
+     * 
+     * @param chargeDetails 工单收费详情
+     * @return 结果
+     */
+    public int insertChargeDetails(ChargeDetails chargeDetails);
+
+    /**
+     * 修改工单收费详情
+     * 
+     * @param chargeDetails 工单收费详情
+     * @return 结果
+     */
+    public int updateChargeDetails(ChargeDetails chargeDetails);
+
+    /**
+     * 删除工单收费详情
+     * 
+     * @param id 工单收费详情主键
+     * @return 结果
+     */
+    public int deleteChargeDetailsById(Long id);
+
+    /**
+     * 批量删除工单收费详情
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteChargeDetailsByIds(Long[] ids);
+
+    void deleteChargeDetailsByOrderId(String orderId);
+}

+ 21 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/ChinaAreaMapper.java

@@ -0,0 +1,21 @@
+package com.ruoyi.system.mapper;
+
+
+import com.ruoyi.common.core.domain.entity.ChinaArea;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * @author tjf
+ * @Date: 2022/03/25/9:40
+ */
+@Mapper
+public interface ChinaAreaMapper {
+
+    /**
+     * 查询行政区域规划列表
+     * @return
+     */
+    List<ChinaArea> selectChinaAreaList(ChinaArea chinaArea);
+}

+ 61 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/OperationRecordMapper.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.ruoyi.system.domain.OperationRecord;
+
+/**
+ * 操作记录Mapper接口
+ * 
+ * @author boman
+ * @date 2025-05-16
+ */
+public interface OperationRecordMapper 
+{
+    /**
+     * 查询操作记录
+     * 
+     * @param id 操作记录主键
+     * @return 操作记录
+     */
+    public OperationRecord selectOperationRecordById(Long id);
+
+    /**
+     * 查询操作记录列表
+     * 
+     * @param operationRecord 操作记录
+     * @return 操作记录集合
+     */
+    public List<OperationRecord> selectOperationRecordList(OperationRecord operationRecord);
+
+    /**
+     * 新增操作记录
+     * 
+     * @param operationRecord 操作记录
+     * @return 结果
+     */
+    public int insertOperationRecord(OperationRecord operationRecord);
+
+    /**
+     * 修改操作记录
+     * 
+     * @param operationRecord 操作记录
+     * @return 结果
+     */
+    public int updateOperationRecord(OperationRecord operationRecord);
+
+    /**
+     * 删除操作记录
+     * 
+     * @param id 操作记录主键
+     * @return 结果
+     */
+    public int deleteOperationRecordById(Long id);
+
+    /**
+     * 批量删除操作记录
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteOperationRecordByIds(Long[] ids);
+}

+ 63 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/WorkOrderFjMapper.java

@@ -0,0 +1,63 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.ruoyi.system.domain.WorkOrderFj;
+
+/**
+ * 工单_附件Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2025-05-12
+ */
+public interface WorkOrderFjMapper 
+{
+    /**
+     * 查询工单_附件
+     * 
+     * @param id 工单_附件主键
+     * @return 工单_附件
+     */
+    public WorkOrderFj selectWorkOrderFjById(Long id);
+
+    /**
+     * 查询工单_附件列表
+     * 
+     * @param workOrderFj 工单_附件
+     * @return 工单_附件集合
+     */
+    public List<WorkOrderFj> selectWorkOrderFjList(WorkOrderFj workOrderFj);
+
+    /**
+     * 新增工单_附件
+     * 
+     * @param workOrderFj 工单_附件
+     * @return 结果
+     */
+    public int insertWorkOrderFj(WorkOrderFj workOrderFj);
+
+    /**
+     * 修改工单_附件
+     * 
+     * @param workOrderFj 工单_附件
+     * @return 结果
+     */
+    public int updateWorkOrderFj(WorkOrderFj workOrderFj);
+
+    /**
+     * 删除工单_附件
+     * 
+     * @param id 工单_附件主键
+     * @return 结果
+     */
+    public int deleteWorkOrderFjById(Long id);
+
+    /**
+     * 批量删除工单_附件
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteWorkOrderFjByIds(Long[] ids);
+
+    void deleteWorkOrderFj(WorkOrderFj workOrderFj);
+}

+ 72 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/WorkOrderInfoMapper.java

@@ -0,0 +1,72 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.ruoyi.system.domain.WorkOrderInfo;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 工单信息Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2025-05-12
+ */
+public interface WorkOrderInfoMapper 
+{
+    /**
+     * 查询工单信息
+     * 
+     * @param orderId 工单信息主键
+     * @return 工单信息
+     */
+    public WorkOrderInfo selectWorkOrderInfoByOrderId(String orderId);
+
+    /**
+     * 查询工单信息列表
+     * 
+     * @param workOrderInfo 工单信息
+     * @return 工单信息集合
+     */
+    public List<WorkOrderInfo> selectWorkOrderInfoList(WorkOrderInfo workOrderInfo);
+
+    /**
+     * 新增工单信息
+     * 
+     * @param workOrderInfo 工单信息
+     * @return 结果
+     */
+    public int insertWorkOrderInfo(WorkOrderInfo workOrderInfo);
+
+    /**
+     * 修改工单信息
+     * 
+     * @param workOrderInfo 工单信息
+     * @return 结果
+     */
+    public int updateWorkOrderInfo(WorkOrderInfo workOrderInfo);
+
+    /**
+     * 删除工单信息
+     * 
+     * @param orderId 工单信息主键
+     * @return 结果
+     */
+    public int deleteWorkOrderInfoByOrderId(String orderId);
+
+    /**
+     * 批量删除工单信息
+     * 
+     * @param orderIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteWorkOrderInfoByOrderIds(String[] orderIds);
+
+    List<WorkOrderInfo> selectWorkOrderInfoListBymonth(String month);
+
+    List<WorkOrderInfo> selectWorkOrderInfoListByTime(@Param("startDate")String startDate, @Param("endDate")String endDate, @Param("userId")Long userId);
+
+    List<WorkOrderInfo> selectWorkOrderInfoListBymonthOne(String month);
+
+    List<WorkOrderInfo> selectWorkOrderInfoListByYearOne(String year);
+
+    List<WorkOrderInfo> selectWorkOrderInfoListByYear(@Param("year")String year, @Param("userId")Long userId);
+}

+ 61 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/IBasicInfoService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+import com.ruoyi.system.domain.BasicInfo;
+
+/**
+ * 基本信息Service接口
+ * 
+ * @author ruoyi
+ * @date 2025-05-12
+ */
+public interface IBasicInfoService 
+{
+    /**
+     * 查询基本信息
+     * 
+     * @param id 基本信息主键
+     * @return 基本信息
+     */
+    public BasicInfo selectBasicInfoById(Long id);
+
+    /**
+     * 查询基本信息列表
+     * 
+     * @param basicInfo 基本信息
+     * @return 基本信息集合
+     */
+    public List<BasicInfo> selectBasicInfoList(BasicInfo basicInfo);
+
+    /**
+     * 新增基本信息
+     * 
+     * @param basicInfo 基本信息
+     * @return 结果
+     */
+    public int insertBasicInfo(BasicInfo basicInfo);
+
+    /**
+     * 修改基本信息
+     * 
+     * @param basicInfo 基本信息
+     * @return 结果
+     */
+    public int updateBasicInfo(BasicInfo basicInfo);
+
+    /**
+     * 批量删除基本信息
+     * 
+     * @param ids 需要删除的基本信息主键集合
+     * @return 结果
+     */
+    public int deleteBasicInfoByIds(Long[] ids);
+
+    /**
+     * 删除基本信息信息
+     * 
+     * @param id 基本信息主键
+     * @return 结果
+     */
+    public int deleteBasicInfoById(Long id);
+}

+ 61 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/IChargeDetailsService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+import com.ruoyi.system.domain.ChargeDetails;
+
+/**
+ * 工单收费详情Service接口
+ * 
+ * @author ruoyi
+ * @date 2025-05-12
+ */
+public interface IChargeDetailsService 
+{
+    /**
+     * 查询工单收费详情
+     * 
+     * @param id 工单收费详情主键
+     * @return 工单收费详情
+     */
+    public ChargeDetails selectChargeDetailsById(Long id);
+
+    /**
+     * 查询工单收费详情列表
+     * 
+     * @param chargeDetails 工单收费详情
+     * @return 工单收费详情集合
+     */
+    public List<ChargeDetails> selectChargeDetailsList(ChargeDetails chargeDetails);
+
+    /**
+     * 新增工单收费详情
+     * 
+     * @param chargeDetails 工单收费详情
+     * @return 结果
+     */
+    public int insertChargeDetails(ChargeDetails chargeDetails);
+
+    /**
+     * 修改工单收费详情
+     * 
+     * @param chargeDetails 工单收费详情
+     * @return 结果
+     */
+    public int updateChargeDetails(ChargeDetails chargeDetails);
+
+    /**
+     * 批量删除工单收费详情
+     * 
+     * @param ids 需要删除的工单收费详情主键集合
+     * @return 结果
+     */
+    public int deleteChargeDetailsByIds(Long[] ids);
+
+    /**
+     * 删除工单收费详情信息
+     * 
+     * @param id 工单收费详情主键
+     * @return 结果
+     */
+    public int deleteChargeDetailsById(Long id);
+}

+ 18 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/IChinaAreaService.java

@@ -0,0 +1,18 @@
+package com.ruoyi.system.service;
+
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.ChinaArea;
+
+/**
+ * @author tjf
+ * @Date: 2022/03/25/9:39
+ */
+public interface IChinaAreaService {
+    /**
+     * 查询行政区域规划列表
+     * @param chinaArea
+     * @return
+     */
+    public AjaxResult selectChinaAreaList(ChinaArea chinaArea);
+}

+ 61 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/IOperationRecordService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+import com.ruoyi.system.domain.OperationRecord;
+
+/**
+ * 操作记录Service接口
+ * 
+ * @author boman
+ * @date 2025-05-16
+ */
+public interface IOperationRecordService 
+{
+    /**
+     * 查询操作记录
+     * 
+     * @param id 操作记录主键
+     * @return 操作记录
+     */
+    public OperationRecord selectOperationRecordById(Long id);
+
+    /**
+     * 查询操作记录列表
+     * 
+     * @param operationRecord 操作记录
+     * @return 操作记录集合
+     */
+    public List<OperationRecord> selectOperationRecordList(OperationRecord operationRecord);
+
+    /**
+     * 新增操作记录
+     * 
+     * @param operationRecord 操作记录
+     * @return 结果
+     */
+    public int insertOperationRecord(OperationRecord operationRecord);
+
+    /**
+     * 修改操作记录
+     * 
+     * @param operationRecord 操作记录
+     * @return 结果
+     */
+    public int updateOperationRecord(OperationRecord operationRecord);
+
+    /**
+     * 批量删除操作记录
+     * 
+     * @param ids 需要删除的操作记录主键集合
+     * @return 结果
+     */
+    public int deleteOperationRecordByIds(Long[] ids);
+
+    /**
+     * 删除操作记录信息
+     * 
+     * @param id 操作记录主键
+     * @return 结果
+     */
+    public int deleteOperationRecordById(Long id);
+}

+ 2 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java

@@ -203,4 +203,6 @@ public interface ISysUserService
      * @return 结果
      */
     public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName);
+
+    List<SysUser> noPage(SysUser user);
 }

+ 61 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/IWorkOrderFjService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+import com.ruoyi.system.domain.WorkOrderFj;
+
+/**
+ * 工单_附件Service接口
+ * 
+ * @author ruoyi
+ * @date 2025-05-12
+ */
+public interface IWorkOrderFjService 
+{
+    /**
+     * 查询工单_附件
+     * 
+     * @param id 工单_附件主键
+     * @return 工单_附件
+     */
+    public WorkOrderFj selectWorkOrderFjById(Long id);
+
+    /**
+     * 查询工单_附件列表
+     * 
+     * @param workOrderFj 工单_附件
+     * @return 工单_附件集合
+     */
+    public List<WorkOrderFj> selectWorkOrderFjList(WorkOrderFj workOrderFj);
+
+    /**
+     * 新增工单_附件
+     * 
+     * @param workOrderFj 工单_附件
+     * @return 结果
+     */
+    public int insertWorkOrderFj(WorkOrderFj workOrderFj);
+
+    /**
+     * 修改工单_附件
+     * 
+     * @param workOrderFj 工单_附件
+     * @return 结果
+     */
+    public int updateWorkOrderFj(WorkOrderFj workOrderFj);
+
+    /**
+     * 批量删除工单_附件
+     * 
+     * @param ids 需要删除的工单_附件主键集合
+     * @return 结果
+     */
+    public int deleteWorkOrderFjByIds(Long[] ids);
+
+    /**
+     * 删除工单_附件信息
+     * 
+     * @param id 工单_附件主键
+     * @return 结果
+     */
+    public int deleteWorkOrderFjById(Long id);
+}

+ 86 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/IWorkOrderInfoService.java

@@ -0,0 +1,86 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.system.domain.WorkOrderInfo;
+import com.ruoyi.system.domain.vo.WordVo;
+
+/**
+ * 工单信息Service接口
+ * 
+ * @author ruoyi
+ * @date 2025-05-12
+ */
+public interface IWorkOrderInfoService 
+{
+    /**
+     * 查询工单信息
+     * 
+     * @param orderId 工单信息主键
+     * @return 工单信息
+     */
+    public WorkOrderInfo selectWorkOrderInfoByOrderId(String orderId);
+
+    /**
+     * 查询工单信息列表
+     * 
+     * @param workOrderInfo 工单信息
+     * @return 工单信息集合
+     */
+    public List<WorkOrderInfo> selectWorkOrderInfoList(WorkOrderInfo workOrderInfo);
+
+    /**
+     * 新增工单信息
+     * 
+     * @param workOrderInfo 工单信息
+     * @return 结果
+     */
+    public int insertWorkOrderInfo(WorkOrderInfo workOrderInfo);
+
+    /**
+     * 修改工单信息
+     * 
+     * @param workOrderInfo 工单信息
+     * @return 结果
+     */
+    public int updateWorkOrderInfo(WorkOrderInfo workOrderInfo);
+
+    /**
+     * 批量删除工单信息
+     * 
+     * @param orderIds 需要删除的工单信息主键集合
+     * @return 结果
+     */
+    public int deleteWorkOrderInfoByOrderIds(String[] orderIds);
+
+    /**
+     * 删除工单信息信息
+     * 
+     * @param orderId 工单信息主键
+     * @return 结果
+     */
+    public int deleteWorkOrderInfoByOrderId(String orderId);
+
+    int jd(WorkOrderInfo workOrderInfo);
+
+    AjaxResult dzgd(String orderId);
+
+    AjaxResult qm(WordVo wordVo);
+
+    AjaxResult lc();
+
+    AjaxResult fw();
+
+    AjaxResult bj();
+
+    AjaxResult statisticsJd();
+
+    AjaxResult dbNum();
+
+    AjaxResult monthPx(String time);
+
+    AjaxResult yearPx(String time);
+
+    AjaxResult yearFwlx(String time);
+}

+ 96 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BasicInfoServiceImpl.java

@@ -0,0 +1,96 @@
+package com.ruoyi.system.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.system.mapper.BasicInfoMapper;
+import com.ruoyi.system.domain.BasicInfo;
+import com.ruoyi.system.service.IBasicInfoService;
+
+/**
+ * 基本信息Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2025-05-12
+ */
+@Service
+public class BasicInfoServiceImpl implements IBasicInfoService 
+{
+    @Autowired
+    private BasicInfoMapper basicInfoMapper;
+
+    /**
+     * 查询基本信息
+     * 
+     * @param id 基本信息主键
+     * @return 基本信息
+     */
+    @Override
+    public BasicInfo selectBasicInfoById(Long id)
+    {
+        return basicInfoMapper.selectBasicInfoById(id);
+    }
+
+    /**
+     * 查询基本信息列表
+     * 
+     * @param basicInfo 基本信息
+     * @return 基本信息
+     */
+    @Override
+    public List<BasicInfo> selectBasicInfoList(BasicInfo basicInfo)
+    {
+        return basicInfoMapper.selectBasicInfoList(basicInfo);
+    }
+
+    /**
+     * 新增基本信息
+     * 
+     * @param basicInfo 基本信息
+     * @return 结果
+     */
+    @Override
+    public int insertBasicInfo(BasicInfo basicInfo)
+    {
+        basicInfo.setCreateTime(DateUtils.getNowDate());
+        return basicInfoMapper.insertBasicInfo(basicInfo);
+    }
+
+    /**
+     * 修改基本信息
+     * 
+     * @param basicInfo 基本信息
+     * @return 结果
+     */
+    @Override
+    public int updateBasicInfo(BasicInfo basicInfo)
+    {
+        basicInfo.setUpdateTime(DateUtils.getNowDate());
+        return basicInfoMapper.updateBasicInfo(basicInfo);
+    }
+
+    /**
+     * 批量删除基本信息
+     * 
+     * @param ids 需要删除的基本信息主键
+     * @return 结果
+     */
+    @Override
+    public int deleteBasicInfoByIds(Long[] ids)
+    {
+        return basicInfoMapper.deleteBasicInfoByIds(ids);
+    }
+
+    /**
+     * 删除基本信息信息
+     * 
+     * @param id 基本信息主键
+     * @return 结果
+     */
+    @Override
+    public int deleteBasicInfoById(Long id)
+    {
+        return basicInfoMapper.deleteBasicInfoById(id);
+    }
+}

+ 93 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ChargeDetailsServiceImpl.java

@@ -0,0 +1,93 @@
+package com.ruoyi.system.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.system.mapper.ChargeDetailsMapper;
+import com.ruoyi.system.domain.ChargeDetails;
+import com.ruoyi.system.service.IChargeDetailsService;
+
+/**
+ * 工单收费详情Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2025-05-12
+ */
+@Service
+public class ChargeDetailsServiceImpl implements IChargeDetailsService 
+{
+    @Autowired
+    private ChargeDetailsMapper chargeDetailsMapper;
+
+    /**
+     * 查询工单收费详情
+     * 
+     * @param id 工单收费详情主键
+     * @return 工单收费详情
+     */
+    @Override
+    public ChargeDetails selectChargeDetailsById(Long id)
+    {
+        return chargeDetailsMapper.selectChargeDetailsById(id);
+    }
+
+    /**
+     * 查询工单收费详情列表
+     * 
+     * @param chargeDetails 工单收费详情
+     * @return 工单收费详情
+     */
+    @Override
+    public List<ChargeDetails> selectChargeDetailsList(ChargeDetails chargeDetails)
+    {
+        return chargeDetailsMapper.selectChargeDetailsList(chargeDetails);
+    }
+
+    /**
+     * 新增工单收费详情
+     * 
+     * @param chargeDetails 工单收费详情
+     * @return 结果
+     */
+    @Override
+    public int insertChargeDetails(ChargeDetails chargeDetails)
+    {
+        return chargeDetailsMapper.insertChargeDetails(chargeDetails);
+    }
+
+    /**
+     * 修改工单收费详情
+     * 
+     * @param chargeDetails 工单收费详情
+     * @return 结果
+     */
+    @Override
+    public int updateChargeDetails(ChargeDetails chargeDetails)
+    {
+        return chargeDetailsMapper.updateChargeDetails(chargeDetails);
+    }
+
+    /**
+     * 批量删除工单收费详情
+     * 
+     * @param ids 需要删除的工单收费详情主键
+     * @return 结果
+     */
+    @Override
+    public int deleteChargeDetailsByIds(Long[] ids)
+    {
+        return chargeDetailsMapper.deleteChargeDetailsByIds(ids);
+    }
+
+    /**
+     * 删除工单收费详情信息
+     * 
+     * @param id 工单收费详情主键
+     * @return 结果
+     */
+    @Override
+    public int deleteChargeDetailsById(Long id)
+    {
+        return chargeDetailsMapper.deleteChargeDetailsById(id);
+    }
+}

+ 131 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ChinaAreaServiceImpl.java

@@ -0,0 +1,131 @@
+package com.ruoyi.system.service.impl;
+
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.TreeSelect;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.core.domain.entity.ChinaArea;
+import com.ruoyi.system.mapper.ChinaAreaMapper;
+import com.ruoyi.system.service.IChinaAreaService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.ruoyi.common.constant.UserConstants.CHINA_AREA;
+
+
+/**
+ * @author tjf
+ * @Date: 2022/03/25/9:39
+ */
+@Service
+public class ChinaAreaServiceImpl implements IChinaAreaService {
+
+    @Resource
+    private RedisCache redisService;
+
+    @Resource
+    private ChinaAreaMapper chinaAreaMapper;
+    /**
+     * 获取行政区域规划下拉树列表
+     * @param chinaArea
+     * @return
+     */
+    @Override
+    public AjaxResult selectChinaAreaList(ChinaArea chinaArea) {
+
+        //先去从redis获取
+        List<TreeSelect> treeSelects = redisService.getCacheList(CHINA_AREA+chinaArea.getPid());
+        if (treeSelects != null && treeSelects.size() > 0){
+            //log.info("从缓存中获取到区域集合");
+            return AjaxResult.success(treeSelects);
+        }
+        List<ChinaArea> chinaAreas = chinaAreaMapper.selectChinaAreaList(chinaArea);
+        if (chinaAreas != null && chinaAreas.size() > 0){
+            //log.info("从数据库中获取到行政区域集合");
+            redisService.setCacheList(CHINA_AREA+chinaArea.getPid(),chinaAreas);
+        }
+        return AjaxResult.success(chinaAreas);
+    }
+
+
+    /**
+     * 构建前端所需要下拉树结构
+     *
+     * @param chinaAreaList 行政区域列表
+     * @return 下拉树结构列表
+     */
+    public List<TreeSelect> buildChinaAreaTreeSelect(List<ChinaArea> chinaAreaList) {
+        List<ChinaArea> chinaAreaTrees = buildChinaAreaTree(chinaAreaList);
+        return chinaAreaTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
+    }
+
+
+    /**
+     * 构建前端所需要树结构
+     *
+     * @param chinaAreaList 行政区域列表
+     * @return 树结构列表
+     */
+    public List<ChinaArea> buildChinaAreaTree(List<ChinaArea> chinaAreaList) {
+        List<ChinaArea> returnList = new ArrayList<ChinaArea>();
+        List<String> tempList = new ArrayList<String>();
+        for (ChinaArea chinaArea : chinaAreaList) {
+            tempList.add(chinaArea.getAreaId());
+        }
+        for (Iterator<ChinaArea> iterator = chinaAreaList.iterator(); iterator.hasNext(); ) {
+            ChinaArea chinaArea = (ChinaArea) iterator.next();
+            // 如果是顶级节点, 遍历该父节点的所有子节点
+            if (!tempList.contains(chinaArea.getPid())) {
+                recursionFn(chinaAreaList, chinaArea);
+                returnList.add(chinaArea);
+            }
+        }
+        if (returnList.isEmpty()) {
+            returnList = chinaAreaList;
+        }
+        return returnList;
+    }
+
+
+    /**
+     * 递归列表
+     */
+    private void recursionFn(List<ChinaArea> chinaAreaList, ChinaArea c) {
+        // 得到子节点列表
+        List<ChinaArea> childList = getChildList(chinaAreaList, c);
+        c.setChildren(childList);
+        for (ChinaArea chinaArea : chinaAreaList) {
+            if (hasChild(chinaAreaList, chinaArea)) {
+                recursionFn(chinaAreaList, chinaArea);
+            }
+        }
+    }
+
+    /**
+     * 得到子节点列表
+     */
+    private List<ChinaArea> getChildList(List<ChinaArea> chinaAreaList, ChinaArea c) {
+        List<ChinaArea> tlist = new ArrayList<ChinaArea>();
+        Iterator<ChinaArea> it = chinaAreaList.iterator();
+        while (it.hasNext()) {
+            ChinaArea n = (ChinaArea) it.next();
+            if (StringUtils.isNotNull(n.getPid()) && n.getPid().equals(c.getAreaId())) {
+                tlist.add(n);
+            }
+        }
+        return tlist;
+    }
+
+    /**
+     * 判断是否有子节点
+     */
+    private boolean hasChild(List<ChinaArea> list, ChinaArea c) {
+        return getChildList(list, c).size() > 0;
+    }
+}

+ 102 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OperationRecordServiceImpl.java

@@ -0,0 +1,102 @@
+package com.ruoyi.system.service.impl;
+
+import java.util.List;
+
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.system.mapper.OperationRecordMapper;
+import com.ruoyi.system.domain.OperationRecord;
+import com.ruoyi.system.service.IOperationRecordService;
+
+/**
+ * 操作记录Service业务层处理
+ * 
+ * @author boman
+ * @date 2025-05-16
+ */
+@Service
+public class OperationRecordServiceImpl implements IOperationRecordService 
+{
+    @Autowired
+    private OperationRecordMapper operationRecordMapper;
+
+    /**
+     * 查询操作记录
+     * 
+     * @param id 操作记录主键
+     * @return 操作记录
+     */
+    @Override
+    public OperationRecord selectOperationRecordById(Long id)
+    {
+        return operationRecordMapper.selectOperationRecordById(id);
+    }
+
+    /**
+     * 查询操作记录列表
+     * 
+     * @param operationRecord 操作记录
+     * @return 操作记录
+     */
+    @Override
+    public List<OperationRecord> selectOperationRecordList(OperationRecord operationRecord)
+    {
+        return operationRecordMapper.selectOperationRecordList(operationRecord);
+    }
+
+    /**
+     * 新增操作记录
+     * 
+     * @param operationRecord 操作记录
+     * @return 结果
+     */
+    @Override
+    public int insertOperationRecord(OperationRecord operationRecord)
+    {
+        SysUser user = SecurityUtils.getLoginUser().getUser();
+        operationRecord.setUserId(user.getUserId());
+        operationRecord.setUserName(user.getNickName());
+        operationRecord.setCreateTime(DateUtils.getNowDate());
+        return operationRecordMapper.insertOperationRecord(operationRecord);
+    }
+
+    /**
+     * 修改操作记录
+     * 
+     * @param operationRecord 操作记录
+     * @return 结果
+     */
+    @Override
+    public int updateOperationRecord(OperationRecord operationRecord)
+    {
+        operationRecord.setUpdateTime(DateUtils.getNowDate());
+        return operationRecordMapper.updateOperationRecord(operationRecord);
+    }
+
+    /**
+     * 批量删除操作记录
+     * 
+     * @param ids 需要删除的操作记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteOperationRecordByIds(Long[] ids)
+    {
+        return operationRecordMapper.deleteOperationRecordByIds(ids);
+    }
+
+    /**
+     * 删除操作记录信息
+     * 
+     * @param id 操作记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteOperationRecordById(Long id)
+    {
+        return operationRecordMapper.deleteOperationRecordById(id);
+    }
+}

+ 10 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java

@@ -31,6 +31,8 @@ import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysDeptService;
 import com.ruoyi.system.service.ISysUserService;
 
+import static com.ruoyi.common.constant.UserConstants.WORK_USER;
+
 /**
  * 用户 业务层处理
  * 
@@ -547,4 +549,12 @@ public class SysUserServiceImpl implements ISysUserService
         }
         return successMsg.toString();
     }
+
+    @Override
+    public List<SysUser> noPage(SysUser user) {
+        //查询维修人员角色
+        SysRole info = roleMapper.checkRoleKeyUnique(WORK_USER);
+        user.setRoleId(info.getRoleId());
+        return userMapper.selectAllocatedList(user);
+    }
 }

+ 93 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WorkOrderFjServiceImpl.java

@@ -0,0 +1,93 @@
+package com.ruoyi.system.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.system.mapper.WorkOrderFjMapper;
+import com.ruoyi.system.domain.WorkOrderFj;
+import com.ruoyi.system.service.IWorkOrderFjService;
+
+/**
+ * 工单_附件Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2025-05-12
+ */
+@Service
+public class WorkOrderFjServiceImpl implements IWorkOrderFjService 
+{
+    @Autowired
+    private WorkOrderFjMapper workOrderFjMapper;
+
+    /**
+     * 查询工单_附件
+     * 
+     * @param id 工单_附件主键
+     * @return 工单_附件
+     */
+    @Override
+    public WorkOrderFj selectWorkOrderFjById(Long id)
+    {
+        return workOrderFjMapper.selectWorkOrderFjById(id);
+    }
+
+    /**
+     * 查询工单_附件列表
+     * 
+     * @param workOrderFj 工单_附件
+     * @return 工单_附件
+     */
+    @Override
+    public List<WorkOrderFj> selectWorkOrderFjList(WorkOrderFj workOrderFj)
+    {
+        return workOrderFjMapper.selectWorkOrderFjList(workOrderFj);
+    }
+
+    /**
+     * 新增工单_附件
+     * 
+     * @param workOrderFj 工单_附件
+     * @return 结果
+     */
+    @Override
+    public int insertWorkOrderFj(WorkOrderFj workOrderFj)
+    {
+        return workOrderFjMapper.insertWorkOrderFj(workOrderFj);
+    }
+
+    /**
+     * 修改工单_附件
+     * 
+     * @param workOrderFj 工单_附件
+     * @return 结果
+     */
+    @Override
+    public int updateWorkOrderFj(WorkOrderFj workOrderFj)
+    {
+        return workOrderFjMapper.updateWorkOrderFj(workOrderFj);
+    }
+
+    /**
+     * 批量删除工单_附件
+     * 
+     * @param ids 需要删除的工单_附件主键
+     * @return 结果
+     */
+    @Override
+    public int deleteWorkOrderFjByIds(Long[] ids)
+    {
+        return workOrderFjMapper.deleteWorkOrderFjByIds(ids);
+    }
+
+    /**
+     * 删除工单_附件信息
+     * 
+     * @param id 工单_附件主键
+     * @return 结果
+     */
+    @Override
+    public int deleteWorkOrderFjById(Long id)
+    {
+        return workOrderFjMapper.deleteWorkOrderFjById(id);
+    }
+}

+ 825 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WorkOrderInfoServiceImpl.java

@@ -0,0 +1,825 @@
+package com.ruoyi.system.service.impl;
+
+import java.io.File;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.data.PictureRenderData;
+import com.deepoove.poi.data.Pictures;
+import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
+import com.ruoyi.common.config.RuoYiConfig;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginBody;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.ServletUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.base64.Base64DecodedMultipartFile;
+import com.ruoyi.common.utils.file.FileUploadUtils;
+import com.ruoyi.common.utils.file.FileUtils;
+import com.ruoyi.system.domain.ChargeDetails;
+import com.ruoyi.system.domain.OperationRecord;
+import com.ruoyi.system.domain.WorkOrderFj;
+import com.ruoyi.system.domain.vo.WordVo;
+import com.ruoyi.system.mapper.*;
+import com.ruoyi.system.service.IOperationRecordService;
+import lombok.SneakyThrows;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.system.domain.WorkOrderInfo;
+import com.ruoyi.system.service.IWorkOrderInfoService;
+import org.springframework.web.multipart.MultipartFile;
+
+import static com.ruoyi.common.constant.UserConstants.*;
+import static com.ruoyi.common.utils.DateUtils.YYYY;
+import static com.ruoyi.common.utils.DateUtils.YYYY_MM;
+
+/**
+ * 工单信息Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2025-05-12
+ */
+@Service
+public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService 
+{
+    @Autowired
+    private WorkOrderInfoMapper workOrderInfoMapper;
+
+    @Autowired
+    private WorkOrderFjMapper workOrderFjMapper;
+
+    @Autowired
+    private ChargeDetailsMapper chargeDetailsMapper;
+
+    @Autowired
+    private SysDictDataMapper dictDataMapper;
+    @Autowired
+    private IOperationRecordService operationRecordService;
+    @Autowired
+    private SysUserMapper userMapper;
+
+
+    /**
+     * 查询工单信息
+     * 
+     * @param orderId 工单信息主键
+     * @return 工单信息
+     */
+    @Override
+    public WorkOrderInfo selectWorkOrderInfoByOrderId(String orderId)
+    {
+        WorkOrderInfo workOrderInfo = workOrderInfoMapper.selectWorkOrderInfoByOrderId(orderId);
+        if(workOrderInfo!=null){
+            //查询附件
+            WorkOrderFj workOrderFj = new WorkOrderFj();
+            workOrderFj.setOrderId(orderId);
+            //workOrderFj.setType(USER_DISABLE);
+            List<WorkOrderFj> workOrderFjs = workOrderFjMapper.selectWorkOrderFjList(workOrderFj);
+            if(workOrderFjs!=null && !workOrderFjs.isEmpty()){
+                Map<String,List<WorkOrderFj>> map = workOrderFjs.stream().collect(Collectors.groupingBy(WorkOrderFj::getType));
+                workOrderInfo.setWorkOrderFjXqList(map.get(ONE));
+                workOrderInfo.setWorkOrderFjQmList(map.get(TWO));
+                if(map.get(THR)!=null && !map.get(THR).isEmpty()){
+                    workOrderInfo.setWorkOrderFjgd(map.get(THR).get(0));
+                }
+            }
+            //查询工单收费详情
+            ChargeDetails chargeDetails = new ChargeDetails();
+            chargeDetails.setOrderId(orderId);
+            List<ChargeDetails> chargeDetails1 = chargeDetailsMapper.selectChargeDetailsList(chargeDetails);
+            if(chargeDetails1!=null && !chargeDetails1.isEmpty()){
+                workOrderInfo.setChargeDetailsList(chargeDetails1);
+            }
+
+        }
+        return workOrderInfo;
+    }
+
+    /**
+     * 查询工单信息列表
+     * 
+     * @param workOrderInfo 工单信息
+     * @return 工单信息
+     */
+    @Override
+    public List<WorkOrderInfo> selectWorkOrderInfoList(WorkOrderInfo workOrderInfo)
+    {
+        return workOrderInfoMapper.selectWorkOrderInfoList(workOrderInfo);
+    }
+
+    /**
+     * 新增工单信息
+     * 
+     * @param workOrderInfo 工单信息
+     * @return 结果
+     */
+    @Override
+    public int insertWorkOrderInfo(WorkOrderInfo workOrderInfo)
+    {
+        SysUser user = SecurityUtils.getLoginUser().getUser();
+        workOrderInfo.setUserId(user.getUserId());
+        workOrderInfo.setUserName(user.getUserName());
+        //生成工单编号(时间戳+4位随机数)
+        workOrderInfo.setOrderId(DateUtils.getOrderId());
+        workOrderInfo.setCreateTime(DateUtils.getNowDate());
+        int i = workOrderInfoMapper.insertWorkOrderInfo(workOrderInfo);
+        if(workOrderInfo.getWorkOrderFjXqList()!=null && !workOrderInfo.getWorkOrderFjXqList().isEmpty()){
+            for (WorkOrderFj workOrderFj : workOrderInfo.getWorkOrderFjXqList()) {
+                workOrderFj.setOrderId(workOrderInfo.getOrderId());
+                workOrderFjMapper.insertWorkOrderFj(workOrderFj);
+            }
+        }
+
+        OperationRecord operationRecord = new OperationRecord();
+        operationRecord.setOrderId(workOrderInfo.getOrderId());
+        String type = dictDataMapper.selectDictLabel("service_progress", workOrderInfo.getType());
+        StringBuilder recod = new StringBuilder();
+        recod.append(workOrderInfo.getUnitName()).append("发起了一个").append(type).append(",联系方式").append(workOrderInfo.getPhonenumber());
+        operationRecord.setRecord(recod.toString());
+        operationRecordService.insertOperationRecord(operationRecord);
+        return i;
+    }
+
+    /**
+     * 修改工单信息
+     * 
+     * @param workOrderInfo 工单信息
+     * @return 结果
+     */
+    @Override
+    public int updateWorkOrderInfo(WorkOrderInfo workOrderInfo)
+    {
+
+        if(!THR.equals(workOrderInfo.getServiceProgress())){
+            if(workOrderInfo.getChargeDetailsList()!=null && !workOrderInfo.getChargeDetailsList().isEmpty()){
+                //删除收费信息重新保存
+                chargeDetailsMapper.deleteChargeDetailsByOrderId(workOrderInfo.getOrderId());
+                //删除之后重新保存
+                for (ChargeDetails chargeDetails : workOrderInfo.getChargeDetailsList()) {
+                    chargeDetails.setOrderId(workOrderInfo.getOrderId());
+                    chargeDetailsMapper.insertChargeDetails(chargeDetails);
+                }
+            }
+            chargeDetailsMapper.deleteChargeDetailsByOrderId(workOrderInfo.getOrderId());
+            if(workOrderInfo.getWorkOrderFjXqList()!=null && !workOrderInfo.getWorkOrderFjXqList().isEmpty()){
+                for (WorkOrderFj workOrderFj : workOrderInfo.getWorkOrderFjXqList()) {
+                    workOrderFj.setOrderId(workOrderInfo.getOrderId());
+                    workOrderFjMapper.insertWorkOrderFj(workOrderFj);
+                }
+            }
+            if(workOrderInfo.getWorkOrderFjQmList()!=null && !workOrderInfo.getWorkOrderFjQmList().isEmpty()){
+                for (WorkOrderFj workOrderFj : workOrderInfo.getWorkOrderFjQmList()) {
+                    workOrderFj.setOrderId(workOrderInfo.getOrderId());
+                    workOrderFjMapper.insertWorkOrderFj(workOrderFj);
+                }
+            }
+            if(workOrderInfo.getWorkOrderFjgd()!=null){
+                workOrderInfo.getWorkOrderFjgd().setOrderId(workOrderInfo.getOrderId());
+                workOrderFjMapper.insertWorkOrderFj(workOrderInfo.getWorkOrderFjgd());
+            }
+        }
+        if(TWO.equals(workOrderInfo.getServiceProgress())){
+            workOrderInfo.setAgency(TWO);
+
+            //操作记录
+            OperationRecord operationRecord = new OperationRecord();
+            operationRecord.setOrderId(workOrderInfo.getOrderId());
+            String type = dictDataMapper.selectDictLabel("service_progress", workOrderInfo.getType());
+            StringBuilder recod = new StringBuilder();
+            recod.append(workOrderInfo.getUnitName()).append("的").append(type).append("已结束;客户暂无评价");
+            operationRecord.setRecord(recod.toString());
+            operationRecordService.insertOperationRecord(operationRecord);
+        }
+        if(THR.equals(workOrderInfo.getServiceProgress())){
+            //操作记录
+            OperationRecord operationRecord = new OperationRecord();
+            operationRecord.setOrderId(workOrderInfo.getOrderId());
+            String type = dictDataMapper.selectDictLabel("service_progress", workOrderInfo.getType());
+            StringBuilder recod = new StringBuilder();
+            recod.append(workOrderInfo.getUnitName()).append("的").append(type).append("已结束;客户评价:").append(workOrderInfo.getEvaluationContent());
+            operationRecord.setRecord(recod.toString());
+            operationRecordService.insertOperationRecord(operationRecord);
+        }
+        workOrderInfo.setUpdateTime(DateUtils.getNowDate());
+        return workOrderInfoMapper.updateWorkOrderInfo(workOrderInfo);
+    }
+
+    /**
+     * 批量删除工单信息
+     * 
+     * @param orderIds 需要删除的工单信息主键
+     * @return 结果
+     */
+    @Override
+    public int deleteWorkOrderInfoByOrderIds(String[] orderIds)
+    {
+        return workOrderInfoMapper.deleteWorkOrderInfoByOrderIds(orderIds);
+    }
+
+    /**
+     * 删除工单信息信息
+     * 
+     * @param orderId 工单信息主键
+     * @return 结果
+     */
+    @Override
+    public int deleteWorkOrderInfoByOrderId(String orderId)
+    {
+        return workOrderInfoMapper.deleteWorkOrderInfoByOrderId(orderId);
+    }
+
+    @Override
+    public int jd(WorkOrderInfo workOrderInfo) {
+        //操作记录
+        WorkOrderInfo orderInfo = workOrderInfoMapper.selectWorkOrderInfoByOrderId(workOrderInfo.getOrderId());
+        OperationRecord operationRecord = new OperationRecord();
+        operationRecord.setOrderId(workOrderInfo.getOrderId());
+        String type = dictDataMapper.selectDictLabel("service_progress", workOrderInfo.getType());
+        StringBuilder recod = new StringBuilder();
+        recod.append(workOrderInfo.getResponsibleName()).append("接下了").append(orderInfo.getUnitName()).append("的");
+        recod.append(type).append("工单:工单编号").append(orderInfo.getOrderId());
+
+        workOrderInfo.setServiceProgress(ONE);
+        workOrderInfo.setTakeTime(DateUtils.getNowDate());
+        workOrderInfo.setAgency(ONE);
+
+        //自主接单
+        if(TWO.equals(workOrderInfo.getOrderPlacement())){
+            SysUser user = SecurityUtils.getLoginUser().getUser();
+            workOrderInfo.setResponsibleId(user.getUserId());
+            workOrderInfo.setResponsibleName(user.getNickName());
+            workOrderInfo.setResponsiblePhone(user.getPhonenumber());
+            workOrderInfo.setAgency(TWO);
+            recod = new StringBuilder();
+            recod.append(workOrderInfo.getResponsibleName()).append("被分派了").append(orderInfo.getUnitName()).append("的");
+            recod.append(type).append("工单:工单编号").append(orderInfo.getOrderId());
+        }
+        operationRecord.setRecord(recod.toString());
+        operationRecordService.insertOperationRecord(operationRecord);
+        return workOrderInfoMapper.updateWorkOrderInfo(workOrderInfo);
+    }
+
+    @Override
+    public AjaxResult dzgd(String orderId) {
+        //查询工单信息
+        WorkOrderInfo workOrderInfo = workOrderInfoMapper.selectWorkOrderInfoByOrderId(orderId);
+        //查询工单收费详情
+        ChargeDetails chargeDetails = new ChargeDetails();
+        chargeDetails.setOrderId(orderId);
+        List<ChargeDetails> chargeDetails1 = chargeDetailsMapper.selectChargeDetailsList(chargeDetails);
+        if(chargeDetails1!=null && !chargeDetails1.isEmpty()){
+            workOrderInfo.setChargeDetailsList(chargeDetails1);
+        }
+
+
+        HashMap<String, Object> finalMap = new HashMap<>();
+        finalMap.put("khmc",workOrderInfo.getUnitName());
+        finalMap.put("xmmc",workOrderInfo.getProjectName());
+        if(ONE.equals(workOrderInfo.getShelfLife())){
+            finalMap.put("bzqn",true);
+            finalMap.put("bzqw",false);
+        }else{
+            finalMap.put("bzqn",false);
+            finalMap.put("bzqw",true);
+        }
+
+        if(YES.equals(workOrderInfo.getIsCharge())){
+            finalMap.put("sfs",true);
+            finalMap.put("sff",false);
+        }else{
+            finalMap.put("sfs",false);
+            finalMap.put("sff",true);
+        }
+        finalMap.put("rmbdx",workOrderInfo.getTotalCostDx());
+        finalMap.put("rmb",workOrderInfo.getTotalCost());
+        finalMap.put("bz",workOrderInfo.getRemark());
+        finalMap.put("lxfs",workOrderInfo.getPhonenumber());
+        finalMap.put("rq",DateUtils.getDate());
+        finalMap.put("bz", workOrderInfo.getRemark());
+        finalMap.put("qm", "{{@qm}}");
+
+        List<Object> workList = new ArrayList<>();
+        if(chargeDetails1!=null && !chargeDetails1.isEmpty()){
+            for (int i = 0; i < chargeDetails1.size(); i++) {
+                HashMap<String, Object> workItem = new HashMap<>();
+                workItem.put("xh", i + 1);
+                workItem.put("cpmc", chargeDetails1.get(i).getProductName());
+                workItem.put("sl", chargeDetails1.get(i).getProductNum());
+                workItem.put("dw", chargeDetails1.get(i).getProductUnit());
+                workItem.put("dj", chargeDetails1.get(i).getUnitPrice());
+                workItem.put("zj", chargeDetails1.get(i).getTotalPrice());
+                workList.add(workItem);
+            }
+        }
+        finalMap.put("workList", workList);
+
+
+        // 插入图片
+        /*try {
+            //这里也可以是用文件服务器返回的网络文件流
+            String pictureUrl = "http://5b0988e595225.cdn.sohucs.com/images/20171013/fec49f59b98041a4a16886893447f746.jpeg";
+            pictureUrl = "D:\\xx\\Java项目\\xx\\sxsoft_expert\\staticfile\\下载.png";
+            // 从网络流读取图片,置入word模板,等待编译
+            if (StringUtils.isNotEmpty(pictureUrl)) {
+                //PictureRenderData picture = Pictures.ofUrl(pictureUrl).size(40, 30).create();//网络图片地址
+                PictureRenderData picture = Pictures.ofLocal(pictureUrl).size(40, 30).create();//本地图片地址
+                finalMap.put("signPicture", picture);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }*/
+
+
+        // 从网络url 下载word模板到指定文件夹
+        File wordTemplate = new File("D:\\ruoyi\\uploadPath\\gongdan\\muban\\工单模板.docx");
+        // 此处使用了poi-tl的<表格行循环插件>,此处一定要进行参数bind,方便word模板参数替换
+        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
+        Configure build = Configure.builder().bind(policy, "workList").build();
+        XWPFTemplate render = XWPFTemplate.compile(wordTemplate, build).render(finalMap);
+        // 此处是利用File,直接在本地创建文件,将参数替换后的文件流写入到该文件,word就是最终的结果
+        String fileName =workOrderInfo.getUnitName()+"-"+workOrderInfo.getProjectName() + "项目工单.docx";
+        String templatePath ="/profile/upload/" + fileName;
+        String path = RuoYiConfig.getUploadPath() +"/"+ fileName;;
+        File word = new File(path);
+        try {
+            render.writeToFile(word.getAbsolutePath());
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        //将文件路径存入数据库
+        WorkOrderFj workOrderFj = new WorkOrderFj();
+        workOrderFj.setOrderId(orderId);
+        workOrderFj.setName(fileName);
+        workOrderFj.setUrl(templatePath);
+        workOrderFj.setType(THR);
+        //删除之前生成的文件
+        workOrderFjMapper.deleteWorkOrderFj(workOrderFj);
+        workOrderFjMapper.insertWorkOrderFj(workOrderFj);
+        return AjaxResult.success("成功",templatePath);
+    }
+
+    @SneakyThrows
+    @Override
+    public AjaxResult qm(WordVo wordVo) {
+        //查询工单信息
+        WorkOrderInfo workOrderInfo = workOrderInfoMapper.selectWorkOrderInfoByOrderId(wordVo.getOrderId());
+
+        String base64String = wordVo.getImage();
+        if (base64String.contains("data:")) {
+            int start = base64String.indexOf(",");
+            base64String = base64String.substring(start + 1);
+        }
+        base64String = base64String.replaceAll("\r|\n", "");
+        base64String = base64String.trim();
+
+        int s = wordVo.getImage().indexOf(",");
+        String head = wordVo.getImage().substring(0,s + 1);
+
+        MultipartFile file = Base64DecodedMultipartFile.base64Convert(base64String,head,workOrderInfo.getOrderId()+"签字");
+        // 上传文件路径
+        String filePath = RuoYiConfig.getUploadPath();
+        // 上传并返回新文件名称
+        String fileName = FileUploadUtils.upload(filePath, file);
+        //将文件路径存入数据库
+        WorkOrderFj workOrderFj = new WorkOrderFj();
+        workOrderFj.setOrderId(wordVo.getOrderId());
+        workOrderFj.setName(FileUtils.getName(fileName));
+        workOrderFj.setUrl(fileName);
+        workOrderFj.setType(TWO);
+        //删除之前生成的文件
+        workOrderFjMapper.deleteWorkOrderFj(workOrderFj);
+        workOrderFjMapper.insertWorkOrderFj(workOrderFj);
+        //将文件写入word
+        WorkOrderFj workFj = new WorkOrderFj();
+        workFj.setOrderId(wordVo.getOrderId());
+        workFj.setType(THR);
+        List<WorkOrderFj> workOrderFjs = workOrderFjMapper.selectWorkOrderFjList(workFj);
+
+        HashMap<String, Object> finalMap = new HashMap<>();
+        //这里也可以是用文件服务器返回的网络文件流
+        String pictureUrl =  fileName.replace("/profile",RuoYiConfig.getProfile());
+        // 从网络流读取图片,置入word模板,等待编译
+        if (StringUtils.isNotEmpty(pictureUrl)) {
+            //PictureRenderData picture = Pictures.ofUrl(pictureUrl).size(100, 60).create();//网络图片地址
+            PictureRenderData picture = Pictures.ofLocal(pictureUrl).size(100, 60).create();//本地图片地址
+            finalMap.put("qm", picture);
+        }
+        // 从网络url 下载word模板到指定文件夹
+        //http://192.168.101.86:8077 "D:\\ruoyi\\uploadPath\\gongdan\\muban\\工单模板.docx"
+        File wordTemplate = new File(RuoYiConfig.getUploadPath()+"/"+workOrderFjs.get(0).getName());
+        // 此处使用了poi-tl的<表格行循环插件>,此处一定要进行参数bind,方便word模板参数替换
+        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
+        Configure build = Configure.builder().bind(policy, "workList").build();
+        XWPFTemplate render = XWPFTemplate.compile(wordTemplate, build).render(finalMap);
+        // 此处是利用File,直接在本地创建文件,将参数替换后的文件流写入到该文件,word就是最终的结果
+        String name =workOrderInfo.getUnitName()+"-"+workOrderInfo.getProjectName() + "项目工单.docx";
+        String templatePath ="/profile/upload/" + name;
+        String path = RuoYiConfig.getUploadPath() +"/"+ name;;
+        File word = new File(path);
+        try {
+            render.writeToFile(word.getAbsolutePath());
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        workOrderInfo.setServiceProgress(TWO);
+        workOrderInfoMapper.updateWorkOrderInfo(workOrderInfo);
+        return AjaxResult.success("成功");
+    }
+
+    @Override
+    public AjaxResult lc() {
+
+        Map<String,Object> map = new HashMap<>();
+        int zs = 0;
+        int djd = 0;
+        int jxz = 0;
+        int ywc = 0;
+        int dpj = 0;
+        int ypj = 0;
+        int szs = 0;
+        String zz = "0%";
+        //获取当前月
+        String month = DateUtils.dateTimeNow(YYYY_MM);
+        //获取上个月
+        String lastMonth = DateUtils.lastMonth();
+        //本月单量
+        List<WorkOrderInfo> workOrderInfoList = workOrderInfoMapper.selectWorkOrderInfoListBymonth(month);
+        //上个月单量
+        List<WorkOrderInfo> lastWorkOrderInfoList = workOrderInfoMapper.selectWorkOrderInfoListBymonth(lastMonth);
+        if(lastWorkOrderInfoList!=null && !lastWorkOrderInfoList.isEmpty()){
+            szs = lastWorkOrderInfoList.size();
+        }
+        if(workOrderInfoList!=null && !workOrderInfoList.isEmpty()){
+            zs = workOrderInfoList.size();
+            Map<String,List<WorkOrderInfo>> workOrderInfomap = workOrderInfoList.stream().collect(Collectors.groupingBy(WorkOrderInfo::getServiceProgress));
+            if(workOrderInfomap.get(NORMAL)!=null && !workOrderInfomap.get(NORMAL).isEmpty()){
+                djd = workOrderInfomap.get(NORMAL).size();
+            }
+            if(workOrderInfomap.get(ONE)!=null && !workOrderInfomap.get(ONE).isEmpty()){
+                jxz = workOrderInfomap.get(ONE).size();
+            }
+            if(workOrderInfomap.get(TWO)!=null && !workOrderInfomap.get(TWO).isEmpty()){
+                ywc = workOrderInfomap.get(TWO).size();
+            }
+            if(workOrderInfomap.get(THR)!=null && !workOrderInfomap.get(THR).isEmpty()){
+                ypj = workOrderInfomap.get(THR).size();
+            }
+            dpj = ywc-ypj;
+            BigDecimal bzs = new BigDecimal(zs);
+            BigDecimal bszs = new BigDecimal(szs);
+            BigDecimal fz = bzs.subtract(bszs);
+            BigDecimal percentage = bzs.multiply(new BigDecimal("100"))
+                    .divide(fz, 3, RoundingMode.HALF_UP) // 先计算百分比并保留三位小数以处理可能的精度问题
+                    .setScale(1, RoundingMode.HALF_UP);     // 再设置为一位小数
+            zz = percentage.toString()+"%";
+
+        }
+        map.put("zs", zs);
+        map.put("djd", djd);
+        map.put("jxz", jxz);
+        map.put("ywc", ywc);
+        map.put("dpj", dpj);
+        map.put("zz", zz);
+        return AjaxResult.success(map);
+    }
+
+    @Override
+    public AjaxResult fw() {
+        Map<String,Object> map = new HashMap<>();
+        int zs = 0;
+        int wlfw = 0;
+        int sbfw = 0;
+        int rjfw = 0;
+        int kffw = 0;
+        int sjfw = 0;
+        int qtfw = 0;
+        //获取当前月
+        String month = DateUtils.dateTimeNow(YYYY_MM);
+        //本月单量
+        List<WorkOrderInfo> workOrderInfoList = workOrderInfoMapper.selectWorkOrderInfoListBymonth(month);
+        if(workOrderInfoList!=null && !workOrderInfoList.isEmpty()){
+            zs = workOrderInfoList.size();
+            Map<String,List<WorkOrderInfo>> workOrderInfomap = workOrderInfoList.stream().collect(Collectors.groupingBy(WorkOrderInfo::getType));
+
+            if(workOrderInfomap.get(ONE)!=null && !workOrderInfomap.get(ONE).isEmpty()){
+                wlfw = workOrderInfomap.get(ONE).size();
+            }
+            if(workOrderInfomap.get(TWO)!=null && !workOrderInfomap.get(TWO).isEmpty()){
+                sbfw = workOrderInfomap.get(TWO).size();
+            }
+            if(workOrderInfomap.get(THR)!=null && !workOrderInfomap.get(THR).isEmpty()){
+                rjfw = workOrderInfomap.get(THR).size();
+            }
+            if(workOrderInfomap.get(FOR)!=null && !workOrderInfomap.get(FOR).isEmpty()){
+                kffw = workOrderInfomap.get(FOR).size();
+            }
+            if(workOrderInfomap.get(FIV)!=null && !workOrderInfomap.get(FIV).isEmpty()){
+                sjfw = workOrderInfomap.get(FIV).size();
+            }
+            if(workOrderInfomap.get(SIX)!=null && !workOrderInfomap.get(SIX).isEmpty()){
+                qtfw = workOrderInfomap.get(SIX).size();
+            }
+        }
+        map.put("zs", zs);
+        map.put("wlfw", wlfw);
+        map.put("sbfw", sbfw);
+        map.put("rjfw", rjfw);
+        map.put("kffw", kffw);
+        map.put("sjfw", sjfw);
+        map.put("qtfw", qtfw);
+        return AjaxResult.success(map);
+    }
+
+    @Override
+    public AjaxResult bj() {
+        Map<String,Object> map = new HashMap<>();
+        //获取当前月
+        String month = DateUtils.dateTimeNow(YYYY_MM);
+        //获取上个月
+        String lastMonth = DateUtils.lastMonth();
+        //本月单量
+        List<WorkOrderInfo> workOrderInfoList = workOrderInfoMapper.selectWorkOrderInfoListBymonth(month);
+        //上个月单量
+        List<WorkOrderInfo> lastWorkOrderInfoList = workOrderInfoMapper.selectWorkOrderInfoListBymonth(lastMonth);
+        List<String> y = new ArrayList<>();
+        List<Integer> x1 = new ArrayList<>();
+        List<Integer> x2 = new ArrayList<>();
+        y.add("网络服务");
+        y.add("设备服务");
+        y.add("软件服务");
+        y.add("开发服务");
+        y.add("设计服务");
+        y.add("其他服务");
+        //本月
+        int wlfw = 0;
+        int sbfw = 0;
+        int rjfw = 0;
+        int kffw = 0;
+        int sjfw = 0;
+        int qtfw = 0;
+        //上月
+        int swlfw = 0;
+        int ssbfw = 0;
+        int srjfw = 0;
+        int skffw = 0;
+        int ssjfw = 0;
+        int sqtfw = 0;
+        if(workOrderInfoList!=null && !workOrderInfoList.isEmpty()){
+            Map<String,List<WorkOrderInfo>> workOrderInfomap = workOrderInfoList.stream().collect(Collectors.groupingBy(WorkOrderInfo::getType));
+
+            if(workOrderInfomap.get(ONE)!=null && !workOrderInfomap.get(ONE).isEmpty()){
+                wlfw = workOrderInfomap.get(ONE).size();
+            }
+            if(workOrderInfomap.get(TWO)!=null && !workOrderInfomap.get(TWO).isEmpty()){
+                sbfw = workOrderInfomap.get(TWO).size();
+            }
+            if(workOrderInfomap.get(THR)!=null && !workOrderInfomap.get(THR).isEmpty()){
+                rjfw = workOrderInfomap.get(THR).size();
+            }
+            if(workOrderInfomap.get(FOR)!=null && !workOrderInfomap.get(FOR).isEmpty()){
+                kffw = workOrderInfomap.get(FOR).size();
+            }
+            if(workOrderInfomap.get(FIV)!=null && !workOrderInfomap.get(FIV).isEmpty()){
+                sjfw = workOrderInfomap.get(FIV).size();
+            }
+            if(workOrderInfomap.get(SIX)!=null && !workOrderInfomap.get(SIX).isEmpty()){
+                qtfw = workOrderInfomap.get(SIX).size();
+            }
+        }
+        if(lastWorkOrderInfoList!=null && !lastWorkOrderInfoList.isEmpty()){
+            Map<String,List<WorkOrderInfo>> workOrderInfomap = lastWorkOrderInfoList.stream().collect(Collectors.groupingBy(WorkOrderInfo::getType));
+
+            if(workOrderInfomap.get(ONE)!=null && !workOrderInfomap.get(ONE).isEmpty()){
+                swlfw = workOrderInfomap.get(ONE).size();
+            }
+            if(workOrderInfomap.get(TWO)!=null && !workOrderInfomap.get(TWO).isEmpty()){
+                ssbfw = workOrderInfomap.get(TWO).size();
+            }
+            if(workOrderInfomap.get(THR)!=null && !workOrderInfomap.get(THR).isEmpty()){
+                srjfw = workOrderInfomap.get(THR).size();
+            }
+            if(workOrderInfomap.get(FOR)!=null && !workOrderInfomap.get(FOR).isEmpty()){
+                skffw = workOrderInfomap.get(FOR).size();
+            }
+            if(workOrderInfomap.get(FIV)!=null && !workOrderInfomap.get(FIV).isEmpty()){
+                ssjfw = workOrderInfomap.get(FIV).size();
+            }
+            if(workOrderInfomap.get(SIX)!=null && !workOrderInfomap.get(SIX).isEmpty()){
+                sqtfw = workOrderInfomap.get(SIX).size();
+            }
+        }
+        x1.add(wlfw);
+        x1.add(sbfw);
+        x1.add(rjfw);
+        x1.add(kffw);
+        x1.add(sjfw);
+        x1.add(qtfw);
+
+        x2.add(swlfw);
+        x2.add(ssbfw);
+        x2.add(srjfw);
+        x2.add(skffw);
+        x2.add(ssjfw);
+        x2.add(sqtfw);
+        map.put("y",y);
+        map.put("x1",x1);
+        map.put("x2",x2);
+        return AjaxResult.success(map);
+    }
+
+    @Override
+    public AjaxResult statisticsJd() {
+        Map<String,Object> map = new HashMap<>();
+        int zs = 0;
+        int zzjd = 0;
+        int zdfp = 0;
+        String zzbfb = "0%";
+        String zpbfb = "0%";
+        //获取季度的开始时间和结束时间
+        String startDate = DateUtils.startQuarterly()+" 00:00:00";
+        String endDate = DateUtils.endQuarterly()+" 23:59:59";
+        SysUser user = SecurityUtils.getLoginUser().getUser();
+        List<WorkOrderInfo> workOrderInfoList = workOrderInfoMapper.selectWorkOrderInfoListByTime(startDate,endDate,user.getUserId());
+        if(workOrderInfoList!=null && !workOrderInfoList.isEmpty()){
+            zs = workOrderInfoList.size();
+            BigDecimal bzs = new BigDecimal(zs);
+            Map<String,List<WorkOrderInfo>> workOrderInfomap = workOrderInfoList.stream().collect(Collectors.groupingBy(WorkOrderInfo::getOrderPlacement));
+            if(workOrderInfomap.get(ONE)!=null && !workOrderInfomap.get(ONE).isEmpty()){
+                zzjd = workOrderInfomap.get(ONE).size();
+                BigDecimal bzhjd = new BigDecimal(zzjd);
+                BigDecimal percentage = bzs.multiply(new BigDecimal("100"))
+                        .divide(bzhjd, 3, RoundingMode.HALF_UP) // 先计算百分比并保留三位小数以处理可能的精度问题
+                        .setScale(1, RoundingMode.HALF_UP);     // 再设置为一位小数
+                zzbfb = percentage.toString()+"%";
+            }
+            if(workOrderInfomap.get(TWO)!=null && !workOrderInfomap.get(TWO).isEmpty()){
+                zdfp = workOrderInfomap.get(TWO).size();
+                BigDecimal bzdfp = new BigDecimal(zdfp);
+                BigDecimal percentage = bzs.multiply(new BigDecimal("100"))
+                        .divide(bzdfp, 3, RoundingMode.HALF_UP) // 先计算百分比并保留三位小数以处理可能的精度问题
+                        .setScale(1, RoundingMode.HALF_UP);     // 再设置为一位小数
+                zpbfb = percentage.toString()+"%";
+            }
+        }
+        map.put("zs",zs);
+        map.put("zzjd",zzjd);
+        map.put("zdfp",zdfp);
+        map.put("zpbfb",zpbfb);
+        map.put("zzbfb",zzbfb);
+        return AjaxResult.success(map);
+    }
+
+    @Override
+    public AjaxResult dbNum() {
+        int num = 0;
+        SysUser user = SecurityUtils.getLoginUser().getUser();
+        WorkOrderInfo workOrderInfo = new WorkOrderInfo();
+        workOrderInfo.setDelFlag(NO);
+        workOrderInfo.setAgency(ONE);
+        workOrderInfo.setResponsibleId(user.getUserId());
+        List<WorkOrderInfo> workOrderInfos = workOrderInfoMapper.selectWorkOrderInfoList(workOrderInfo);
+        if(workOrderInfos!=null && !workOrderInfos.isEmpty()){
+            num = workOrderInfos.size();
+        }
+        return AjaxResult.success(num);
+    }
+
+    @Override
+    public AjaxResult monthPx(String time) {
+        if(StringUtils.isEmpty(time)){
+            time = DateUtils.dateTimeNow(YYYY_MM);
+        }
+        //本月单量
+        List<WorkOrderInfo> workOrderInfoList = workOrderInfoMapper.selectWorkOrderInfoListBymonthOne(time);
+        Map<Long, Integer> map = new HashMap<>();
+        if(workOrderInfoList!=null && !workOrderInfoList.isEmpty()){
+            Map<Long,List<WorkOrderInfo>> workOrderInfomap = workOrderInfoList.stream().collect(Collectors.groupingBy(WorkOrderInfo::getResponsibleId));
+            for (Long s : workOrderInfomap.keySet()) {
+                map.put(s,workOrderInfomap.get(s).size());
+            }
+        }
+        // 使用Stream API和Collectors.toList()将entries转换为List
+        List<Map.Entry<Long, Integer>> entries = new ArrayList<>(map.entrySet());
+
+        // 根据value排序,这里是升序
+        //entries.sort(Map.Entry.comparingByValue());
+        // 如果你需要降序,可以这样做:
+        entries.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));
+        //取前6个
+        List<Map<String, Object>> listMap = new ArrayList<>();
+        for (int i = 0; i < 6; i++) {
+            if(entries.size()<i+1){
+                break;
+            }
+            Map<String, Object> mapPx = new HashMap<>();
+            SysUser sysUser = userMapper.selectUserById(entries.get(i).getKey());
+            mapPx.put("xh",i+1);
+            mapPx.put("name",sysUser.getNickName());
+            mapPx.put("deptName",sysUser.getDept().getDeptName());
+            mapPx.put("num",entries.get(i).getValue());
+            listMap.add(mapPx);
+        }
+
+        return AjaxResult.success(listMap);
+    }
+
+    @Override
+    public AjaxResult yearPx(String time) {
+        if(StringUtils.isEmpty(time)){
+            time = DateUtils.dateTimeNow(YYYY);
+        }
+        //本年单量
+        List<WorkOrderInfo> workOrderInfoList = workOrderInfoMapper.selectWorkOrderInfoListByYearOne(time);
+        Map<Long, Integer> map = new HashMap<>();
+        if(workOrderInfoList!=null && !workOrderInfoList.isEmpty()){
+            Map<Long,List<WorkOrderInfo>> workOrderInfomap = workOrderInfoList.stream().collect(Collectors.groupingBy(WorkOrderInfo::getResponsibleId));
+            for (Long s : workOrderInfomap.keySet()) {
+                map.put(s,workOrderInfomap.get(s).size());
+            }
+        }
+        // 使用Stream API和Collectors.toList()将entries转换为List
+        List<Map.Entry<Long, Integer>> entries = new ArrayList<>(map.entrySet());
+
+        // 根据value排序,这里是升序
+        //entries.sort(Map.Entry.comparingByValue());
+        // 如果你需要降序,可以这样做:
+        entries.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));
+        //取前6个
+        List<Map<String, Object>> listMap = new ArrayList<>();
+        for (int i = 0; i < 6; i++) {
+            if(entries.size()<i+1){
+                break;
+            }
+            Map<String, Object> mapPx = new HashMap<>();
+            SysUser sysUser = userMapper.selectUserById(entries.get(i).getKey());
+            mapPx.put("xh",i+1);
+            mapPx.put("name",sysUser.getNickName());
+            mapPx.put("deptName",sysUser.getDept().getDeptName());
+            mapPx.put("num",entries.get(i).getValue());
+            listMap.add(mapPx);
+        }
+
+        return AjaxResult.success(listMap);
+    }
+
+    @Override
+    public AjaxResult yearFwlx(String time) {
+        if(StringUtils.isEmpty(time)){
+            time = DateUtils.dateTimeNow(YYYY);
+        }
+        Map<String,Object> map = new HashMap<>();
+        int zs = 0;
+        int wlfw = 0;
+        int sbfw = 0;
+        int rjfw = 0;
+        int kffw = 0;
+        int sjfw = 0;
+        int qtfw = 0;
+
+        SysUser user = SecurityUtils.getLoginUser().getUser();
+        //本年单量
+        List<WorkOrderInfo> workOrderInfoList = workOrderInfoMapper.selectWorkOrderInfoListByYear(time,user.getUserId());
+        if(workOrderInfoList!=null && !workOrderInfoList.isEmpty()){
+            zs = workOrderInfoList.size();
+            Map<String,List<WorkOrderInfo>> workOrderInfomap = workOrderInfoList.stream().collect(Collectors.groupingBy(WorkOrderInfo::getType));
+
+            if(workOrderInfomap.get(ONE)!=null && !workOrderInfomap.get(ONE).isEmpty()){
+                wlfw = workOrderInfomap.get(ONE).size();
+            }
+            if(workOrderInfomap.get(TWO)!=null && !workOrderInfomap.get(TWO).isEmpty()){
+                sbfw = workOrderInfomap.get(TWO).size();
+            }
+            if(workOrderInfomap.get(THR)!=null && !workOrderInfomap.get(THR).isEmpty()){
+                rjfw = workOrderInfomap.get(THR).size();
+            }
+            if(workOrderInfomap.get(FOR)!=null && !workOrderInfomap.get(FOR).isEmpty()){
+                kffw = workOrderInfomap.get(FOR).size();
+            }
+            if(workOrderInfomap.get(FIV)!=null && !workOrderInfomap.get(FIV).isEmpty()){
+                sjfw = workOrderInfomap.get(FIV).size();
+            }
+            if(workOrderInfomap.get(SIX)!=null && !workOrderInfomap.get(SIX).isEmpty()){
+                qtfw = workOrderInfomap.get(SIX).size();
+            }
+        }
+        map.put("zs", zs);
+        map.put("wlfw", wlfw);
+        map.put("sbfw", sbfw);
+        map.put("rjfw", rjfw);
+        map.put("kffw", kffw);
+        map.put("sjfw", sjfw);
+        map.put("qtfw", qtfw);
+        return AjaxResult.success(map);
+    }
+
+
+}

+ 145 - 0
ruoyi-system/src/main/resources/mapper/system/BasicInfoMapper.xml

@@ -0,0 +1,145 @@
+<?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.ruoyi.system.mapper.BasicInfoMapper">
+    
+    <resultMap type="BasicInfo" id="BasicInfoResult">
+        <result property="id"    column="id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="unitName"    column="unit_name"    />
+        <result property="provinceId"    column="province_id"    />
+        <result property="province"    column="province"    />
+        <result property="cityId"    column="city_id"    />
+        <result property="city"    column="city"    />
+        <result property="regionId"    column="region_id"    />
+        <result property="region"    column="region"    />
+        <result property="detailedAddress"    column="detailed_address"    />
+        <result property="lon"    column="lon"    />
+        <result property="lat"    column="lat"    />
+        <result property="personName"    column="person_name"    />
+        <result property="phonenumber"    column="phonenumber"    />
+        <result property="sex"    column="sex"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectBasicInfoVo">
+        select id, user_id, unit_name, province_id, province, city_id, city, region_id, region, detailed_address, lon, lat, person_name, phonenumber, sex, del_flag, create_by, create_time, update_by, update_time, remark from basic_info
+    </sql>
+
+    <select id="selectBasicInfoList" parameterType="BasicInfo" resultMap="BasicInfoResult">
+        <include refid="selectBasicInfoVo"/>
+        <where>  
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="unitName != null  and unitName != ''"> and unit_name like concat('%', #{unitName}, '%')</if>
+            <if test="provinceId != null  and provinceId != ''"> and province_id = #{provinceId}</if>
+            <if test="province != null  and province != ''"> and province = #{province}</if>
+            <if test="cityId != null  and cityId != ''"> and city_id = #{cityId}</if>
+            <if test="city != null  and city != ''"> and city = #{city}</if>
+            <if test="regionId != null  and regionId != ''"> and region_id = #{regionId}</if>
+            <if test="region != null  and region != ''"> and region = #{region}</if>
+            <if test="detailedAddress != null  and detailedAddress != ''"> and detailed_address = #{detailedAddress}</if>
+            <if test="lon != null  and lon != ''"> and lon = #{lon}</if>
+            <if test="lat != null  and lat != ''"> and lat = #{lat}</if>
+            <if test="personName != null  and personName != ''"> and person_name like concat('%', #{personName}, '%')</if>
+            <if test="phonenumber != null  and phonenumber != ''"> and phonenumber = #{phonenumber}</if>
+            <if test="sex != null  and sex != ''"> and sex = #{sex}</if>
+        </where>
+    </select>
+    
+    <select id="selectBasicInfoById" parameterType="Long" resultMap="BasicInfoResult">
+        <include refid="selectBasicInfoVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertBasicInfo" parameterType="BasicInfo" useGeneratedKeys="true" keyProperty="id">
+        insert into basic_info
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null">user_id,</if>
+            <if test="unitName != null">unit_name,</if>
+            <if test="provinceId != null">province_id,</if>
+            <if test="province != null">province,</if>
+            <if test="cityId != null">city_id,</if>
+            <if test="city != null">city,</if>
+            <if test="regionId != null">region_id,</if>
+            <if test="region != null">region,</if>
+            <if test="detailedAddress != null">detailed_address,</if>
+            <if test="lon != null">lon,</if>
+            <if test="lat != null">lat,</if>
+            <if test="personName != null">person_name,</if>
+            <if test="phonenumber != null">phonenumber,</if>
+            <if test="sex != null">sex,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId != null">#{userId},</if>
+            <if test="unitName != null">#{unitName},</if>
+            <if test="provinceId != null">#{provinceId},</if>
+            <if test="province != null">#{province},</if>
+            <if test="cityId != null">#{cityId},</if>
+            <if test="city != null">#{city},</if>
+            <if test="regionId != null">#{regionId},</if>
+            <if test="region != null">#{region},</if>
+            <if test="detailedAddress != null">#{detailedAddress},</if>
+            <if test="lon != null">#{lon},</if>
+            <if test="lat != null">#{lat},</if>
+            <if test="personName != null">#{personName},</if>
+            <if test="phonenumber != null">#{phonenumber},</if>
+            <if test="sex != null">#{sex},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateBasicInfo" parameterType="BasicInfo">
+        update basic_info
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="unitName != null">unit_name = #{unitName},</if>
+            <if test="provinceId != null">province_id = #{provinceId},</if>
+            <if test="province != null">province = #{province},</if>
+            <if test="cityId != null">city_id = #{cityId},</if>
+            <if test="city != null">city = #{city},</if>
+            <if test="regionId != null">region_id = #{regionId},</if>
+            <if test="region != null">region = #{region},</if>
+            <if test="detailedAddress != null">detailed_address = #{detailedAddress},</if>
+            <if test="lon != null">lon = #{lon},</if>
+            <if test="lat != null">lat = #{lat},</if>
+            <if test="personName != null">person_name = #{personName},</if>
+            <if test="phonenumber != null">phonenumber = #{phonenumber},</if>
+            <if test="sex != null">sex = #{sex},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteBasicInfoById" parameterType="Long">
+        delete from basic_info where id = #{id}
+    </delete>
+
+    <delete id="deleteBasicInfoByIds" parameterType="String">
+        delete from basic_info where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 84 - 0
ruoyi-system/src/main/resources/mapper/system/ChargeDetailsMapper.xml

@@ -0,0 +1,84 @@
+<?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.ruoyi.system.mapper.ChargeDetailsMapper">
+    
+    <resultMap type="ChargeDetails" id="ChargeDetailsResult">
+        <result property="id"    column="id"    />
+        <result property="orderId"    column="order_id"    />
+        <result property="productName"    column="product_name"    />
+        <result property="productNum"    column="product_num"    />
+        <result property="productUnit"    column="product_unit"    />
+        <result property="unitPrice"    column="unit_price"    />
+        <result property="totalPrice"    column="total_price"    />
+    </resultMap>
+
+    <sql id="selectChargeDetailsVo">
+        select id, order_id, product_name, product_num, product_unit, unit_price, total_price from charge_details
+    </sql>
+
+    <select id="selectChargeDetailsList" parameterType="ChargeDetails" resultMap="ChargeDetailsResult">
+        <include refid="selectChargeDetailsVo"/>
+        <where>  
+            <if test="orderId != null  and orderId != ''"> and order_id = #{orderId}</if>
+            <if test="productName != null  and productName != ''"> and product_name like concat('%', #{productName}, '%')</if>
+            <if test="productNum != null "> and product_num = #{productNum}</if>
+            <if test="productUnit != null  and productUnit != ''"> and product_unit = #{productUnit}</if>
+            <if test="unitPrice != null  and unitPrice != ''"> and unit_price = #{unitPrice}</if>
+            <if test="totalPrice != null  and totalPrice != ''"> and total_price = #{totalPrice}</if>
+        </where>
+    </select>
+    
+    <select id="selectChargeDetailsById" parameterType="Long" resultMap="ChargeDetailsResult">
+        <include refid="selectChargeDetailsVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertChargeDetails" parameterType="ChargeDetails" useGeneratedKeys="true" keyProperty="id">
+        insert into charge_details
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="orderId != null">order_id,</if>
+            <if test="productName != null">product_name,</if>
+            <if test="productNum != null">product_num,</if>
+            <if test="productUnit != null">product_unit,</if>
+            <if test="unitPrice != null">unit_price,</if>
+            <if test="totalPrice != null">total_price,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="orderId != null">#{orderId},</if>
+            <if test="productName != null">#{productName},</if>
+            <if test="productNum != null">#{productNum},</if>
+            <if test="productUnit != null">#{productUnit},</if>
+            <if test="unitPrice != null">#{unitPrice},</if>
+            <if test="totalPrice != null">#{totalPrice},</if>
+         </trim>
+    </insert>
+
+    <update id="updateChargeDetails" parameterType="ChargeDetails">
+        update charge_details
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="orderId != null">order_id = #{orderId},</if>
+            <if test="productName != null">product_name = #{productName},</if>
+            <if test="productNum != null">product_num = #{productNum},</if>
+            <if test="productUnit != null">product_unit = #{productUnit},</if>
+            <if test="unitPrice != null">unit_price = #{unitPrice},</if>
+            <if test="totalPrice != null">total_price = #{totalPrice},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteChargeDetailsById" parameterType="Long">
+        delete from charge_details where id = #{id}
+    </delete>
+
+    <delete id="deleteChargeDetailsByIds" parameterType="String">
+        delete from charge_details where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    <delete id="deleteChargeDetailsByOrderId" parameterType="String">
+        delete from charge_details where order_id = #{orderId};
+    </delete>
+</mapper>

+ 17 - 0
ruoyi-system/src/main/resources/mapper/system/ChinaAreaMapper.xml

@@ -0,0 +1,17 @@
+<?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.ruoyi.system.mapper.ChinaAreaMapper">
+
+    <resultMap type="ChinaArea" id="ChinaAreaResult">
+        <result property="areaId"    column="area_id"    />
+        <result property="name"    column="name"    />
+        <result property="pid"    column="pid"    />
+        <result property="sort"    column="sort"    />
+    </resultMap>
+    <select id="selectChinaAreaList" resultMap="ChinaAreaResult">
+        select area_id,name,pid,sort from china_area where pid = #{pid} order by sort
+    </select>
+
+</mapper>

+ 96 - 0
ruoyi-system/src/main/resources/mapper/system/OperationRecordMapper.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.ruoyi.system.mapper.OperationRecordMapper">
+    
+    <resultMap type="OperationRecord" id="OperationRecordResult">
+        <result property="id"    column="id"    />
+        <result property="orderId"    column="order_id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="userName"    column="user_name"    />
+        <result property="record"    column="record"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectOperationRecordVo">
+        select id, order_id, user_id, user_name, record, del_flag, create_by, create_time, update_by, update_time, remark from operation_record
+    </sql>
+
+    <select id="selectOperationRecordList" parameterType="OperationRecord" resultMap="OperationRecordResult">
+        <include refid="selectOperationRecordVo"/>
+        <where>  
+            <if test="orderId != null  and orderId != ''"> and order_id = #{orderId}</if>
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="userName != null  and userName != ''"> and user_name like concat('%', #{userName}, '%')</if>
+            <if test="record != null  and record != ''"> and record = #{record}</if>
+        </where>
+        order by create_time
+    </select>
+    
+    <select id="selectOperationRecordById" parameterType="Long" resultMap="OperationRecordResult">
+        <include refid="selectOperationRecordVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertOperationRecord" parameterType="OperationRecord" useGeneratedKeys="true" keyProperty="id">
+        insert into operation_record
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="orderId != null">order_id,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="userName != null">user_name,</if>
+            <if test="record != null">record,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="orderId != null">#{orderId},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="userName != null">#{userName},</if>
+            <if test="record != null">#{record},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateOperationRecord" parameterType="OperationRecord">
+        update operation_record
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="orderId != null">order_id = #{orderId},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="userName != null">user_name = #{userName},</if>
+            <if test="record != null">record = #{record},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteOperationRecordById" parameterType="Long">
+        delete from operation_record where id = #{id}
+    </delete>
+
+    <delete id="deleteOperationRecordByIds" parameterType="String">
+        delete from operation_record where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 78 - 0
ruoyi-system/src/main/resources/mapper/system/WorkOrderFjMapper.xml

@@ -0,0 +1,78 @@
+<?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.ruoyi.system.mapper.WorkOrderFjMapper">
+    
+    <resultMap type="WorkOrderFj" id="WorkOrderFjResult">
+        <result property="id"    column="id"    />
+        <result property="orderId"    column="order_id"    />
+        <result property="name"    column="name"    />
+        <result property="url"    column="url"    />
+        <result property="type"    column="type"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectWorkOrderFjVo">
+        select id, order_id, name, url, type, remark from work_order_fj
+    </sql>
+
+    <select id="selectWorkOrderFjList" parameterType="WorkOrderFj" resultMap="WorkOrderFjResult">
+        <include refid="selectWorkOrderFjVo"/>
+        <where>  
+            <if test="orderId != null  and orderId != ''"> and order_id = #{orderId}</if>
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="url != null  and url != ''"> and url = #{url}</if>
+            <if test="type != null  and type != ''"> and type = #{type}</if>
+        </where>
+    </select>
+    
+    <select id="selectWorkOrderFjById" parameterType="Long" resultMap="WorkOrderFjResult">
+        <include refid="selectWorkOrderFjVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertWorkOrderFj" parameterType="WorkOrderFj" useGeneratedKeys="true" keyProperty="id">
+        insert into work_order_fj
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="orderId != null">order_id,</if>
+            <if test="name != null and name != ''">name,</if>
+            <if test="url != null">url,</if>
+            <if test="type != null">type,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="orderId != null">#{orderId},</if>
+            <if test="name != null and name != ''">#{name},</if>
+            <if test="url != null">#{url},</if>
+            <if test="type != null">#{type},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateWorkOrderFj" parameterType="WorkOrderFj">
+        update work_order_fj
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="orderId != null">order_id = #{orderId},</if>
+            <if test="name != null and name != ''">name = #{name},</if>
+            <if test="url != null">url = #{url},</if>
+            <if test="type != null">type = #{type},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteWorkOrderFjById" parameterType="Long">
+        delete from work_order_fj where id = #{id}
+    </delete>
+
+    <delete id="deleteWorkOrderFjByIds" parameterType="String">
+        delete from work_order_fj where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    <delete id="deleteWorkOrderFj">
+        delete from work_order_fj where order_id = #{orderId} and type = #{type}
+    </delete>
+</mapper>

+ 271 - 0
ruoyi-system/src/main/resources/mapper/system/WorkOrderInfoMapper.xml

@@ -0,0 +1,271 @@
+<?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.ruoyi.system.mapper.WorkOrderInfoMapper">
+    
+    <resultMap type="WorkOrderInfo" id="WorkOrderInfoResult">
+        <result property="orderId"    column="order_id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="userName"    column="user_name"    />
+        <result property="unitName"    column="unit_name"    />
+        <result property="provinceId"    column="province_id"    />
+        <result property="province"    column="province"    />
+        <result property="cityId"    column="city_id"    />
+        <result property="city"    column="city"    />
+        <result property="regionId"    column="region_id"    />
+        <result property="region"    column="region"    />
+        <result property="detailedAddress"    column="detailed_address"    />
+        <result property="lon"    column="lon"    />
+        <result property="lat"    column="lat"    />
+        <result property="personName"    column="person_name"    />
+        <result property="phonenumber"    column="phonenumber"    />
+        <result property="sex"    column="sex"    />
+        <result property="type"    column="type"    />
+        <result property="demand"    column="demand"    />
+        <result property="isSignature"    column="is_signature"    />
+        <result property="evaluation"    column="evaluation"    />
+        <result property="evaluationContent"    column="evaluation_content"    />
+        <result property="serviceProgress"    column="service_progress"    />
+        <result property="serviceType"    column="service_type"    />
+        <result property="orderPlacement"    column="order_placement"    />
+        <result property="agency"    column="agency"    />
+        <result property="responsibleId"    column="responsible_id"    />
+        <result property="responsibleName"    column="responsible_name"    />
+        <result property="responsiblePhone"    column="responsible_phone"    />
+        <result property="takeTime"    column="take_time"    />
+        <result property="projectName"    column="project_name"    />
+        <result property="shelfLife"    column="shelf_life"    />
+        <result property="isCharge"    column="is_charge"    />
+        <result property="totalCost"    column="total_cost"    />
+        <result property="totalCostDx"    column="total_cost_dx"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectWorkOrderInfoVo">
+        select order_id,user_id,user_name, unit_name, province_id, province, city_id, city, region_id, region, detailed_address, lon, lat, person_name, phonenumber, sex, type, demand, is_signature, evaluation, evaluation_content, service_progress,service_type, order_placement,agency, responsible_id, responsible_name,responsible_phone,take_time, project_name, shelf_life, is_charge, total_cost, total_cost_dx, del_flag, create_by, create_time, update_by, update_time, remark from work_order_info
+    </sql>
+
+    <select id="selectWorkOrderInfoList" parameterType="WorkOrderInfo" resultMap="WorkOrderInfoResult">
+        <include refid="selectWorkOrderInfoVo"/>
+        <where>
+            <if test="userId != null  and userId != ''"> and user_id = #{userId}</if>
+            <if test="userName != null  and userName != ''"> and user_name like concat('%', #{userName}, '%')</if>
+            <if test="unitName != null  and unitName != ''"> and unit_name like concat('%', #{unitName}, '%')</if>
+            <if test="provinceId != null  and provinceId != ''"> and province_id = #{provinceId}</if>
+            <if test="province != null  and province != ''"> and province = #{province}</if>
+            <if test="cityId != null  and cityId != ''"> and city_id = #{cityId}</if>
+            <if test="city != null  and city != ''"> and city = #{city}</if>
+            <if test="regionId != null  and regionId != ''"> and region_id = #{regionId}</if>
+            <if test="region != null  and region != ''"> and region = #{region}</if>
+            <if test="detailedAddress != null  and detailedAddress != ''"> and detailed_address = #{detailedAddress}</if>
+            <if test="lon != null  and lon != ''"> and lon = #{lon}</if>
+            <if test="lat != null  and lat != ''"> and lat = #{lat}</if>
+            <if test="personName != null  and personName != ''"> and person_name like concat('%', #{personName}, '%')</if>
+            <if test="phonenumber != null  and phonenumber != ''"> and phonenumber = #{phonenumber}</if>
+            <if test="sex != null  and sex != ''"> and sex = #{sex}</if>
+            <if test="type != null  and type != ''"> and type = #{type}</if>
+            <if test="demand != null  and demand != ''"> and demand = #{demand}</if>
+            <if test="isSignature != null  and isSignature != ''"> and is_signature = #{isSignature}</if>
+            <if test="evaluation != null  and evaluation != ''"> and evaluation = #{evaluation}</if>
+            <if test="evaluationContent != null  and evaluationContent != ''"> and evaluation_content = #{evaluationContent}</if>
+            <if test="serviceProgress != null  and serviceProgress != ''"> and service_progress = #{serviceProgress}</if>
+            <if test="serviceType != null  and serviceType != ''"> and service_type = #{serviceType}</if>
+            <if test="orderPlacement != null  and orderPlacement != ''"> and order_placement = #{orderPlacement}</if>
+            <if test="agency != null  and agency != ''"> and agency = #{agency}</if>
+            <if test="responsibleId != null "> and responsible_id = #{responsibleId}</if>
+            <if test="responsibleName != null  and responsibleName != ''"> and responsible_name like concat('%', #{responsibleName}, '%')</if>
+            <if test="responsiblePhone != null  and responsiblePhone != ''"> and responsible_phone = #{responsiblePhone}</if>
+            <if test="projectName != null  and projectName != ''"> and project_name like concat('%', #{projectName}, '%')</if>
+            <if test="shelfLife != null  and shelfLife != ''"> and shelf_life = #{shelfLife}</if>
+            <if test="isCharge != null  and isCharge != ''"> and is_charge = #{isCharge}</if>
+            <if test="totalCost != null  and totalCost != ''"> and total_cost = #{totalCost}</if>
+            <if test="totalCostDx != null  and totalCostDx != ''"> and total_cost_dx = #{totalCostDx}</if>
+            <if test="delFlag != null  and delFlag != ''"> and del_flag = #{delFlag}</if>
+            <if test="createTime != null and createTime != ''"><!-- 开始时间检索 -->
+                and date_format(create_time,'%y%m%d') = date_format(#{createTime},'%y%m%d')
+            </if>
+        </where>
+        order by create_time desc
+    </select>
+    
+    <select id="selectWorkOrderInfoByOrderId" parameterType="String" resultMap="WorkOrderInfoResult">
+        <include refid="selectWorkOrderInfoVo"/>
+        where order_id = #{orderId}
+    </select>
+
+    <select id="selectWorkOrderInfoListBymonth" parameterType="WorkOrderInfo" resultMap="WorkOrderInfoResult">
+        <include refid="selectWorkOrderInfoVo"/>
+        where date_format(create_time,'%y%m') = date_format(#{month},'%y%m') and del_flag = 'N'
+    </select>
+    <select id="selectWorkOrderInfoListByTime" parameterType="WorkOrderInfo" resultMap="WorkOrderInfoResult">
+        <include refid="selectWorkOrderInfoVo"/>
+        where take_time &gt;= #{startDate}
+        and take_time &lt;= #{endDate}
+        and responsible_id = #{userId}
+        and order_placement !=null
+    </select>
+    <select id="selectWorkOrderInfoListBymonthOne" parameterType="WorkOrderInfo" resultMap="WorkOrderInfoResult">
+        <include refid="selectWorkOrderInfoVo"/>
+        where date_format(create_time,'%y%m') = date_format(#{month},'%y%m') and del_flag = 'N' and responsible_id != null
+    </select>
+    <select id="selectWorkOrderInfoListByYearOne" parameterType="WorkOrderInfo" resultMap="WorkOrderInfoResult">
+        <include refid="selectWorkOrderInfoVo"/>
+        where date_format(create_time,'%y') = date_format(#{year},'%y') and del_flag = 'N' and responsible_id != null
+    </select>
+    <select id="selectWorkOrderInfoListByYear" parameterType="WorkOrderInfo" resultMap="WorkOrderInfoResult">
+        <include refid="selectWorkOrderInfoVo"/>
+        where date_format(create_time,'%y') = date_format(#{year},'%y') and del_flag = 'N'
+        <if test="userId != null and userId !=0"> and responsible_id = #{userId}</if>
+    </select>
+
+    <insert id="insertWorkOrderInfo" parameterType="WorkOrderInfo">
+        insert into work_order_info
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="orderId != null">order_id,</if>
+            <if test="userId != null  ">user_id,</if>
+            <if test="userName != null ">user_name,</if>
+            <if test="unitName != null">unit_name,</if>
+            <if test="provinceId != null">province_id,</if>
+            <if test="province != null">province,</if>
+            <if test="cityId != null">city_id,</if>
+            <if test="city != null">city,</if>
+            <if test="regionId != null">region_id,</if>
+            <if test="region != null">region,</if>
+            <if test="detailedAddress != null">detailed_address,</if>
+            <if test="lon != null">lon,</if>
+            <if test="lat != null">lat,</if>
+            <if test="personName != null">person_name,</if>
+            <if test="phonenumber != null">phonenumber,</if>
+            <if test="sex != null">sex,</if>
+            <if test="type != null">type,</if>
+            <if test="demand != null">demand,</if>
+            <if test="isSignature != null">is_signature,</if>
+            <if test="evaluation != null">evaluation,</if>
+            <if test="evaluationContent != null">evaluation_content,</if>
+            <if test="serviceProgress != null">service_progress,</if>
+            <if test="serviceType != null "> service_type,</if>
+            <if test="orderPlacement != null">order_placement,</if>
+            <if test="agency != null  ">agency,</if>
+            <if test="responsibleId != null">responsible_id,</if>
+            <if test="responsibleName != null">responsible_name,</if>
+            <if test="responsiblePhone != null">responsible_phone,</if>
+            <if test="takeTime != null">take_time,</if>
+            <if test="projectName != null">project_name,</if>
+            <if test="shelfLife != null">shelf_life,</if>
+            <if test="isCharge != null">is_charge,</if>
+            <if test="totalCost != null">total_cost,</if>
+            <if test="totalCostDx != null">total_cost_dx,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="orderId != null">#{orderId},</if>
+            <if test="userId != null  ">#{userId},</if>
+            <if test="userName != null  ">#{userName},</if>
+            <if test="unitName != null">#{unitName},</if>
+            <if test="provinceId != null">#{provinceId},</if>
+            <if test="province != null">#{province},</if>
+            <if test="cityId != null">#{cityId},</if>
+            <if test="city != null">#{city},</if>
+            <if test="regionId != null">#{regionId},</if>
+            <if test="region != null">#{region},</if>
+            <if test="detailedAddress != null">#{detailedAddress},</if>
+            <if test="lon != null">#{lon},</if>
+            <if test="lat != null">#{lat},</if>
+            <if test="personName != null">#{personName},</if>
+            <if test="phonenumber != null">#{phonenumber},</if>
+            <if test="sex != null">#{sex},</if>
+            <if test="type != null">#{type},</if>
+            <if test="demand != null">#{demand},</if>
+            <if test="isSignature != null">#{isSignature},</if>
+            <if test="evaluation != null">#{evaluation},</if>
+            <if test="evaluationContent != null">#{evaluationContent},</if>
+            <if test="serviceProgress != null">#{serviceProgress},</if>
+            <if test="serviceType != null "> #{serviceType},</if>
+            <if test="orderPlacement != null">#{orderPlacement},</if>
+            <if test="agency != null  ">#{agency},</if>
+            <if test="responsibleId != null">#{responsibleId},</if>
+            <if test="responsibleName != null">#{responsibleName},</if>
+            <if test="responsiblePhone != null">#{responsiblePhone},</if>
+            <if test="takeTime != null">#{takeTime},</if>
+            <if test="projectName != null">#{projectName},</if>
+            <if test="shelfLife != null">#{shelfLife},</if>
+            <if test="isCharge != null">#{isCharge},</if>
+            <if test="totalCost != null">#{totalCost},</if>
+            <if test="totalCostDx != null">#{totalCostDx},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateWorkOrderInfo" parameterType="WorkOrderInfo">
+        update work_order_info
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="userId != null  "> user_id = #{userId},</if>
+            <if test="userName != null  ">user_name = #{userName},</if>
+            <if test="unitName != null">unit_name = #{unitName},</if>
+            <if test="provinceId != null">province_id = #{provinceId},</if>
+            <if test="province != null">province = #{province},</if>
+            <if test="cityId != null">city_id = #{cityId},</if>
+            <if test="city != null">city = #{city},</if>
+            <if test="regionId != null">region_id = #{regionId},</if>
+            <if test="region != null">region = #{region},</if>
+            <if test="detailedAddress != null">detailed_address = #{detailedAddress},</if>
+            <if test="lon != null">lon = #{lon},</if>
+            <if test="lat != null">lat = #{lat},</if>
+            <if test="personName != null">person_name = #{personName},</if>
+            <if test="phonenumber != null">phonenumber = #{phonenumber},</if>
+            <if test="sex != null">sex = #{sex},</if>
+            <if test="type != null">type = #{type},</if>
+            <if test="demand != null">demand = #{demand},</if>
+            <if test="isSignature != null">is_signature = #{isSignature},</if>
+            <if test="evaluation != null">evaluation = #{evaluation},</if>
+            <if test="evaluationContent != null">evaluation_content = #{evaluationContent},</if>
+            <if test="serviceProgress != null">service_progress = #{serviceProgress},</if>
+            <if test="serviceType != null ">service_type = #{serviceType},</if>
+            <if test="orderPlacement != null">order_placement = #{orderPlacement},</if>
+            <if test="agency != null  "> agency = #{agency},</if>
+            <if test="responsibleId != null">responsible_id = #{responsibleId},</if>
+            <if test="responsibleName != null">responsible_name = #{responsibleName},</if>
+            <if test="responsiblePhone != null">responsible_phone = #{responsiblePhone},</if>
+            <if test="takeTime != null">take_time = #{takeTime},</if>
+            <if test="projectName != null">project_name = #{projectName},</if>
+            <if test="shelfLife != null">shelf_life = #{shelfLife},</if>
+            <if test="isCharge != null">is_charge = #{isCharge},</if>
+            <if test="totalCost != null">total_cost = #{totalCost},</if>
+            <if test="totalCostDx != null">total_cost_dx = #{totalCostDx},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where order_id = #{orderId}
+    </update>
+
+    <delete id="deleteWorkOrderInfoByOrderId" parameterType="String">
+        delete from work_order_info where order_id = #{orderId}
+    </delete>
+
+    <delete id="deleteWorkOrderInfoByOrderIds" parameterType="String">
+        delete from work_order_info where order_id in 
+        <foreach item="orderId" collection="array" open="(" separator="," close=")">
+            #{orderId}
+        </foreach>
+    </delete>
+</mapper>