LIVE_YE 1 month ago
parent
commit
f64acfaed7
21 changed files with 897 additions and 11 deletions
  1. 1 1
      pom.xml
  2. 12 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
  3. 73 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/work/WorkOrderInfoController.java
  4. 1 1
      ruoyi-admin/src/main/resources/application-druid.yml
  5. 7 0
      ruoyi-common/pom.xml
  6. 4 0
      ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java
  7. 102 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java
  8. 79 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/base64/Base64DecodedMultipartFile.java
  9. 1 1
      ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
  10. 24 0
      ruoyi-system/pom.xml
  11. 40 5
      ruoyi-system/src/main/java/com/ruoyi/system/domain/WorkOrderInfo.java
  12. 29 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/WordVo.java
  13. 2 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/WorkOrderFjMapper.java
  14. 5 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/WorkOrderInfoMapper.java
  15. 2 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
  16. 17 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/IWorkOrderInfoService.java
  17. 10 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
  18. 458 1
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WorkOrderInfoServiceImpl.java
  19. 1 1
      ruoyi-system/src/main/resources/mapper/system/ChinaAreaMapper.xml
  20. 3 0
      ruoyi-system/src/main/resources/mapper/system/WorkOrderFjMapper.xml
  21. 26 1
      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 -->

+ 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")

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

@@ -2,6 +2,8 @@ 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;
@@ -91,6 +93,17 @@ public class WorkOrderInfoController extends BaseController
         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));
+    }
+
     /**
      * 删除工单信息
      */
@@ -101,4 +114,64 @@ public class WorkOrderInfoController extends BaseController
     {
         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();
+    }
+
+    /**
+     * APP首页季度个人接单统计
+     */
+    @PreAuthorize("@ss.hasPermi('work:statistics:jd')")
+    @GetMapping(value = "/statistics/jd")
+    public AjaxResult statisticsJd()
+    {
+        return workOrderInfoService.statisticsJd();
+    }
 }

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

@@ -7,7 +7,7 @@ ruoyi:
     # 版权年份
     copyrightYear: 2025
     # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
-    profile: D:/ruoyi/uploadPath
+    profile: D:/ruoyi/uploadPath/gongdan
     # 获取ip地址开关
     addressEnabled: false
     # 验证码类型 math 数字计算 char 字符验证

+ 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>

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

@@ -89,4 +89,8 @@ public class UserConstants
     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";
 }

+ 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()

+ 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>

+ 40 - 5
ruoyi-system/src/main/java/com/ruoyi/system/domain/WorkOrderInfo.java

@@ -75,7 +75,7 @@ public class WorkOrderInfo extends BaseEntity
     private String sex;
 
     /** 工单类型(1:网络服务,2:设备服务,3:软件服务,4:开发服务,5:设计服务,6:其他服务) */
-    @Excel(name = "工单类型", readConverterExp = "1=:网络服务,2:设备服务,3:软件服务,4:开发服务,5:设计服务,6:其他服务")
+    @Excel(name = "工单类型", readConverterExp = "1=网络服务,2=设备服务,3=软件服务,4=开发服务,5=设计服务,6=其他服务")
     private String type;
 
     /** 客户需求 */
@@ -87,7 +87,7 @@ public class WorkOrderInfo extends BaseEntity
     private String isSignature;
 
     /** 是否满意(0:未评价,1:满意 ,2:不满意) */
-    @Excel(name = "是否满意", readConverterExp = "0=:未评价,1:满意,,=2:不满意")
+    @Excel(name = "是否满意", readConverterExp = "0=未评价,1=满意,,=2=不满意")
     private String evaluation;
 
     /** 评价内容 */
@@ -95,11 +95,15 @@ public class WorkOrderInfo extends BaseEntity
     private String evaluationContent;
 
     /** 服务进展(0:待接单,1:进行中 ,2:已完成,3:已评价) */
-    @Excel(name = "服务进展", readConverterExp = "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:自主接单")
+    @Excel(name = "派单情况", readConverterExp = "1=系统派单,2=自主接单")
     private String orderPlacement;
 
     /** 责任人id */
@@ -110,6 +114,10 @@ public class WorkOrderInfo extends BaseEntity
     @Excel(name = "责任人姓名")
     private String responsibleName;
 
+    /** 责任人手机号 */
+    @Excel(name = "责任人手机号")
+    private String responsiblePhone;
+
     /** 责任人姓名 */
     @Excel(name = "接单时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -120,7 +128,7 @@ public class WorkOrderInfo extends BaseEntity
     private String projectName;
 
     /** 保质期(1:内,2外) */
-    @Excel(name = "保质期", readConverterExp = "1=:内,2外")
+    @Excel(name = "保质期", readConverterExp = "1=内,2=外")
     private String shelfLife;
 
     /** 是否收费(Y是 N否) */
@@ -138,6 +146,9 @@ public class WorkOrderInfo extends BaseEntity
     /** 删除标志(0代表存在 2代表删除) */
     private String delFlag;
 
+    /** 电子工单 */
+    private WorkOrderFj workOrderFjgd;
+
     /** 需求附件 */
     private List<WorkOrderFj> workOrderFjXqList;
 
@@ -432,6 +443,14 @@ public class WorkOrderInfo extends BaseEntity
         this.delFlag = delFlag;
     }
 
+    public String getResponsiblePhone() {
+        return responsiblePhone;
+    }
+
+    public void setResponsiblePhone(String responsiblePhone) {
+        this.responsiblePhone = responsiblePhone;
+    }
+
     public List<WorkOrderFj> getWorkOrderFjXqList() {
         return workOrderFjXqList;
     }
@@ -469,6 +488,22 @@ public class WorkOrderInfo extends BaseEntity
         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;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 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;
+    }
+}

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

@@ -58,4 +58,6 @@ public interface WorkOrderFjMapper
      * @return 结果
      */
     public int deleteWorkOrderFjByIds(Long[] ids);
+
+    void deleteWorkOrderFj(WorkOrderFj workOrderFj);
 }

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

@@ -2,6 +2,7 @@ package com.ruoyi.system.mapper;
 
 import java.util.List;
 import com.ruoyi.system.domain.WorkOrderInfo;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 工单信息Mapper接口
@@ -58,4 +59,8 @@ public interface WorkOrderInfoMapper
      * @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);
 }

+ 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);
 }

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

@@ -1,7 +1,10 @@
 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接口
@@ -58,4 +61,18 @@ public interface IWorkOrderInfoService
      * @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();
 }

+ 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);
+    }
 }

+ 458 - 1
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WorkOrderInfoServiceImpl.java

@@ -1,22 +1,48 @@
 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.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 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.WorkOrderFj;
+import com.ruoyi.system.domain.vo.WordVo;
 import com.ruoyi.system.mapper.ChargeDetailsMapper;
 import com.ruoyi.system.mapper.WorkOrderFjMapper;
+import lombok.SneakyThrows;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.ruoyi.system.mapper.WorkOrderInfoMapper;
 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_MM;
 
 /**
  * 工单信息Service业务层处理
@@ -36,6 +62,7 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService
     @Autowired
     private ChargeDetailsMapper chargeDetailsMapper;
 
+
     /**
      * 查询工单信息
      * 
@@ -56,6 +83,9 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService
                 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();
@@ -90,8 +120,17 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService
     @Override
     public int insertWorkOrderInfo(WorkOrderInfo workOrderInfo)
     {
+        //生成工单编号(时间戳+4位随机数)
+        workOrderInfo.setOrderId(DateUtils.getOrderId());
         workOrderInfo.setCreateTime(DateUtils.getNowDate());
-        return workOrderInfoMapper.insertWorkOrderInfo(workOrderInfo);
+        int i = workOrderInfoMapper.insertWorkOrderInfo(workOrderInfo);
+        if(workOrderInfo.getWorkOrderFjXqList()!=null && !workOrderInfo.getWorkOrderFjXqList().isEmpty()){
+            for (WorkOrderFj workOrderFj : workOrderInfo.getWorkOrderFjXqList()) {
+                workOrderFj.setOrderId(workOrderInfo.getOrderId());
+                workOrderFjMapper.insertWorkOrderFj(workOrderFj);
+            }
+        }
+        return i;
     }
 
     /**
@@ -112,6 +151,12 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService
                 chargeDetailsMapper.insertChargeDetails(chargeDetails);
             }
         }
+        if(workOrderInfo.getWorkOrderFjXqList()!=null && !workOrderInfo.getWorkOrderFjXqList().isEmpty()){
+            for (WorkOrderFj workOrderFj : workOrderInfo.getWorkOrderFjXqList()) {
+                workOrderFj.setOrderId(workOrderInfo.getOrderId());
+                workOrderFjMapper.insertWorkOrderFj(workOrderFj);
+            }
+        }
         workOrderInfo.setUpdateTime(DateUtils.getNowDate());
         return workOrderInfoMapper.updateWorkOrderInfo(workOrderInfo);
     }
@@ -139,4 +184,416 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService
     {
         return workOrderInfoMapper.deleteWorkOrderInfoByOrderId(orderId);
     }
+
+    @Override
+    public int jd(WorkOrderInfo workOrderInfo) {
+        workOrderInfo.setServiceProgress(ONE);
+        workOrderInfo.setTakeTime(DateUtils.getNowDate());
+        SysUser user = SecurityUtils.getLoginUser().getUser();
+        //自主接单
+        if(TWO.equals(workOrderInfo.getOrderPlacement())){
+            workOrderInfo.setResponsibleId(user.getUserId());
+            workOrderInfo.setResponsibleName(user.getNickName());
+            workOrderInfo.setResponsiblePhone(user.getPhonenumber());
+        }
+        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("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());
+        int start = wordVo.getImage().indexOf(",");
+        String head = wordVo.getImage().substring(start + 1);
+        MultipartFile file = Base64DecodedMultipartFile.base64Convert(wordVo.getImage(),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 = "http://5b0988e595225.cdn.sohucs.com/images/20171013/fec49f59b98041a4a16886893447f746.jpeg";
+        pictureUrl = "http://localhost:8077" + fileName;
+        // 从网络流读取图片,置入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);
+        }
+        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);
+    }
 }

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

@@ -2,7 +2,7 @@
 <!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.boman.system.mapper.ChinaAreaMapper">
+<mapper namespace="com.ruoyi.system.mapper.ChinaAreaMapper">
 
     <resultMap type="ChinaArea" id="ChinaAreaResult">
         <result property="areaId"    column="area_id"    />

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

@@ -72,4 +72,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{id}
         </foreach>
     </delete>
+    <delete id="deleteWorkOrderFj">
+        delete from work_order_fj where order_id = #{orderId} and type = #{type}
+    </delete>
 </mapper>

+ 26 - 1
ruoyi-system/src/main/resources/mapper/system/WorkOrderInfoMapper.xml

@@ -25,9 +25,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <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="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"    />
@@ -43,7 +45,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectWorkOrderInfoVo">
-        select order_id, 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, order_placement, responsible_id, responsible_name,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
+        select order_id, 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, 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">
@@ -68,15 +70,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <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="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="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">
@@ -84,6 +92,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         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}
+    </select>
+
     <insert id="insertWorkOrderInfo" parameterType="WorkOrderInfo">
         insert into work_order_info
         <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -107,9 +126,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <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="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>
@@ -144,9 +165,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <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="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>
@@ -184,9 +207,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <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="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>