Sfoglia il codice sorgente

发送钉钉工作通知

lyhzzz 2 anni fa
parent
commit
2d8930fe75
30 ha cambiato i file con 528 aggiunte e 12 eliminazioni
  1. 3 0
      src/main/java/com/fdkankan/sale/SaleApplication.java
  2. 1 0
      src/main/java/com/fdkankan/sale/common/CacheUtil.java
  3. 1 0
      src/main/java/com/fdkankan/sale/common/FilePath.java
  4. 2 3
      src/main/java/com/fdkankan/sale/common/RedisKeyUtil.java
  5. 4 0
      src/main/java/com/fdkankan/sale/common/ResultCode.java
  6. 21 0
      src/main/java/com/fdkankan/sale/controller/DingConfigController.java
  7. 21 0
      src/main/java/com/fdkankan/sale/controller/DingUserController.java
  8. 1 4
      src/main/java/com/fdkankan/sale/controller/SysUserController.java
  9. 27 0
      src/main/java/com/fdkankan/sale/controller/TestController.java
  10. 55 0
      src/main/java/com/fdkankan/sale/entity/DingConfig.java
  11. 3 0
      src/main/java/com/fdkankan/sale/entity/SysUser.java
  12. 1 1
      src/main/java/com/fdkankan/sale/generate/AutoGenerate.java
  13. 29 0
      src/main/java/com/fdkankan/sale/httpClient/client/DingClient.java
  14. 14 0
      src/main/java/com/fdkankan/sale/httpClient/request/DingMsgReq.java
  15. 13 0
      src/main/java/com/fdkankan/sale/httpClient/request/MsgData.java
  16. 17 0
      src/main/java/com/fdkankan/sale/httpClient/request/OaData.java
  17. 18 0
      src/main/java/com/fdkankan/sale/mapper/IDingConfigMapper.java
  18. 17 0
      src/main/java/com/fdkankan/sale/service/IDingConfigService.java
  19. 3 1
      src/main/java/com/fdkankan/sale/service/ISysRoleService.java
  20. 2 0
      src/main/java/com/fdkankan/sale/service/ISysUserService.java
  21. 27 0
      src/main/java/com/fdkankan/sale/service/impl/DingConfigServiceImpl.java
  22. 177 0
      src/main/java/com/fdkankan/sale/service/impl/DingService.java
  23. 3 1
      src/main/java/com/fdkankan/sale/service/impl/RepairInfoService.java
  24. 3 0
      src/main/java/com/fdkankan/sale/service/impl/RepairLogServiceImpl.java
  25. 3 2
      src/main/java/com/fdkankan/sale/service/impl/SysRoleServiceImpl.java
  26. 12 0
      src/main/java/com/fdkankan/sale/service/impl/SysUserServiceImpl.java
  27. 2 0
      src/main/java/com/fdkankan/sale/vo/request/SysUserParam.java
  28. 41 0
      src/main/resources/OA.json
  29. 2 0
      src/main/resources/bootstrap.yml
  30. 5 0
      src/main/resources/mapper/sale/DingConfigMapper.xml

+ 3 - 0
src/main/java/com/fdkankan/sale/SaleApplication.java

@@ -29,6 +29,8 @@ public class SaleApplication implements CommandLineRunner {
     private String host;
     @Value("${main.url}")
     private String mainUrl;
+    @Value("${ding.serve_name}")
+    private String dingServeName;
 
     public static void main(String[] args) {
         SpringApplication.run(SaleApplication.class, args);
@@ -41,5 +43,6 @@ public class SaleApplication implements CommandLineRunner {
         CacheUtil.environment = environment;
         CacheUtil.host = host;
         CacheUtil.mainUrl = mainUrl;
+        CacheUtil.dingServeName = dingServeName;
     }
 }

+ 1 - 0
src/main/java/com/fdkankan/sale/common/CacheUtil.java

@@ -11,6 +11,7 @@ public class CacheUtil {
     public static  String bucket;
     public static  String host;
     public static  String mainUrl;
+    public static  String dingServeName;
 
     public static RepairInvoiceParam invoiceParam = new RepairInvoiceParam();
     public static RepairPayParam payParam = new RepairPayParam();

+ 1 - 0
src/main/java/com/fdkankan/sale/common/FilePath.java

@@ -5,4 +5,5 @@ public class FilePath {
     public static String common = "common";
     public static String file_path = "/home/backend/4dkankan_v4/sale/file/";
     public static String oss_file_path = "sale/file/%s/%s";
+    public static String oss_ding_path = "sale/file/%s/%s";
 }

+ 2 - 3
src/main/java/com/fdkankan/sale/common/RedisKeyUtil.java

@@ -3,9 +3,8 @@ package com.fdkankan.sale.common;
 public class RedisKeyUtil {
 
 
-    public static final String SCENE_UNUSED_NUMS = "4dkankan:scene:nums";
-    public static final String SCENE_NUMS_LOADING = "4dkankan:scene:nums:loading";
-    public static final String loginNum= "manage:login:userName:%s:ip:%s";
+    public static final String dingKeyToken= "sale:ding:access_token:%s:";
+    public static final String dingKeyUsrId= "sale:ding:access_token:%s:phone:%s:";
 
     public static final String loginToken= "manage:login:token:%s";
 

+ 4 - 0
src/main/java/com/fdkankan/sale/common/ResultCode.java

@@ -46,6 +46,10 @@ public enum ResultCode  {
     DEL_USER_REPAIR(60021, "当前用户存在未完结的工单,不可删除"),
     REPAIR_CHECK_EMPTY(60022, "维修检测记录为空"),
 
+    DING_CONFIG_EMPTY(60023, "钉钉配置文件不存在"),
+    DING_CONFIG_ERROR(60024, "钉钉配置文件不存在"),
+    DING_PHONE_ERROR(60025, "钉钉获取用户id失败"),
+    DING_SEND_ERROR(60026, "发送钉钉失败"),
 
 
     ;

+ 21 - 0
src/main/java/com/fdkankan/sale/controller/DingConfigController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.sale.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-12
+ */
+@RestController
+@RequestMapping("/sale/dingConfig")
+public class DingConfigController {
+
+}
+

+ 21 - 0
src/main/java/com/fdkankan/sale/controller/DingUserController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.sale.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-12
+ */
+@RestController
+@RequestMapping("/sale/dingUser")
+public class DingUserController {
+
+}
+

+ 1 - 4
src/main/java/com/fdkankan/sale/controller/SysUserController.java

@@ -98,10 +98,7 @@ public class SysUserController extends BaseController{
      */
     @GetMapping("/getByRoleType")
     public ResultData getByRoleType(@RequestParam(required = false,defaultValue = "1") Integer roleType){
-        SysRole role = sysRoleService.getByRoleType(roleType);
-        LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(SysUser::getRoleId,role.getId());
-        return ResultData.ok(sysUserService.list(wrapper));
+        return ResultData.ok(sysUserService.getByRoleType(roleType));
     }
 }
 

+ 27 - 0
src/main/java/com/fdkankan/sale/controller/TestController.java

@@ -2,13 +2,19 @@ package com.fdkankan.sale.controller;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.io.FileUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.dtflys.forest.annotation.Post;
+import com.dtflys.forest.annotation.Var;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
 import com.fdkankan.sale.common.ResultCode;
 import com.fdkankan.sale.common.ResultData;
 import com.fdkankan.sale.entity.Camera;
 import com.fdkankan.sale.entity.CameraDetail;
 import com.fdkankan.sale.exception.BusinessException;
+import com.fdkankan.sale.httpClient.client.DingClient;
+import com.fdkankan.sale.httpClient.request.DingMsgReq;
+import com.fdkankan.sale.httpClient.request.MsgData;
 import com.fdkankan.sale.service.ICameraDetailService;
 import com.fdkankan.sale.service.ICameraService;
 import com.fdkankan.sale.service.IPriceListService;
@@ -53,6 +59,27 @@ public class TestController {
     ICameraService cameraService;
     @Autowired
     ICameraDetailService cameraDetailService;
+    @Autowired
+    DingClient dingClient;
+    @Autowired
+    FYunFileServiceInterface fYunFileServiceInterface;
+
+    @GetMapping("/testD")
+    public ResultData testD(HttpServletResponse response) throws IOException, DocumentException {
+        //模板中需要批量添加的,list{.**},obj{**}中的数据,
+        JSONObject token = dingClient.getToken("dingefudkq6mrpijygvk", "CcFoQeo3g3ZOPzyWdpFe89b_bFq4TJfmbqG2ycmbESzMu3nlCeXjvKyj7vTaSyyC");
+        String access_token = token.getString("access_token");
+        //JSONObject userByMobile = dingClient.getUserByMobile(access_token, "13825625448");
+        //01102853516526346000,020000431330571403
+        //String userid = userByMobile.getString("userid");
+        DingMsgReq dingMsgReq = new DingMsgReq();
+        dingMsgReq.setAgent_id("2581138442");
+        dingMsgReq.setUserid_list("01102853516526346000");
+        String fileContent = fYunFileServiceInterface.getFileContent("sale/file/common/OA.json");
+        dingMsgReq.setMsg(JSONObject.parseObject(fileContent));
+        JSONObject jsonObject = dingClient.sendMsg(access_token, dingMsgReq);
+        return ResultData.ok(jsonObject);
+    }
 
 
     @GetMapping("/test1")

+ 55 - 0
src/main/java/com/fdkankan/sale/entity/DingConfig.java

@@ -0,0 +1,55 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-12
+ */
+@Getter
+@Setter
+@TableName("t_ding_config")
+public class DingConfig implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 钉钉应用配置-售后
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("agent_id")
+    private String agentId;
+
+    @TableField("app_key")
+    private String appKey;
+
+    @TableField("app_secret")
+    private String appSecret;
+
+    @TableField("serve_name")
+    private String serveName;
+
+    @TableField("remark")
+    private String remark;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 3 - 0
src/main/java/com/fdkankan/sale/entity/SysUser.java

@@ -79,4 +79,7 @@ public class SysUser implements Serializable {
 
     @TableField(value = "manage_id")
     private Long manageId;
+
+    @TableField(value = "ding_account")
+    private String dingAccount;
 }

+ 1 - 1
src/main/java/com/fdkankan/sale/generate/AutoGenerate.java

@@ -18,7 +18,7 @@ public class AutoGenerate {
         String path =System.getProperty("user.dir");
 
         generate(path,"sale", getTables(new String[]{
-                "t_repair_register_log"
+                "t_ding_user","t_ding_config"
         }));
 
 //        generate(path,"goods", getTables(new String[]{

+ 29 - 0
src/main/java/com/fdkankan/sale/httpClient/client/DingClient.java

@@ -0,0 +1,29 @@
+package com.fdkankan.sale.httpClient.client;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.dtflys.forest.annotation.*;
+import com.fdkankan.sale.httpClient.request.DingMsgReq;
+
+@BaseRequest(sslProtocol = "TLS")
+public interface DingClient {
+
+    /**
+     * 获取access_token
+     * 正常情况下access_token有效期为7200秒,有效期内重复获取返回相同结果,并自动续期。
+     */
+    @Get("https://oapi.dingtalk.com/gettoken?appkey={appkey}&appsecret={appSecret}")
+    JSONObject getToken(@Var("appkey") String appkey, @Var("appSecret") String appSecret);
+
+    /**
+     * 根据手机号获取userid
+     */
+    @Get("https://oapi.dingtalk.com/user/get_by_mobile?access_token={accessToken}&mobile={mobile}")
+    JSONObject getUserByMobile(@Var("accessToken") String accessToken, @Var("mobile") String mobile);
+
+    /**
+     * 发送钉钉消息通知
+     */
+    @Post("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2?access_token={accessToken}")
+    JSONObject sendMsg(@Var("accessToken") String accessToken, @JSONBody DingMsgReq object);
+}

+ 14 - 0
src/main/java/com/fdkankan/sale/httpClient/request/DingMsgReq.java

@@ -0,0 +1,14 @@
+package com.fdkankan.sale.httpClient.request;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+import org.apache.commons.lang3.StringUtils;
+
+@Data
+public class DingMsgReq {
+    private String agent_id;
+    private String userid_list;
+    private JSONObject msg;
+    private Boolean to_all_user = false;
+
+}

+ 13 - 0
src/main/java/com/fdkankan/sale/httpClient/request/MsgData.java

@@ -0,0 +1,13 @@
+package com.fdkankan.sale.httpClient.request;
+
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.JsonObject;
+import lombok.Data;
+
+
+@Data
+public class MsgData {
+    private String msgtype;
+    private JsonObject text;
+    private JSONObject oa;
+}

+ 17 - 0
src/main/java/com/fdkankan/sale/httpClient/request/OaData.java

@@ -0,0 +1,17 @@
+package com.fdkankan.sale.httpClient.request;
+
+import lombok.Data;
+
+@Data
+public class OaData {
+    private String  mailUrl;
+    private String  repairId;
+    private String  repairCreateTime;
+    private String  cameraTypeStr;
+    private String  cameraSnCode;
+    private String  warrantyTypeStr;
+    private String  repairStatusStr;
+    private String  description;
+
+    private Long sysUserId;
+}

+ 18 - 0
src/main/java/com/fdkankan/sale/mapper/IDingConfigMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.sale.mapper;
+
+import com.fdkankan.sale.entity.DingConfig;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-12
+ */
+@Mapper
+public interface IDingConfigMapper extends BaseMapper<DingConfig> {
+
+}

+ 17 - 0
src/main/java/com/fdkankan/sale/service/IDingConfigService.java

@@ -0,0 +1,17 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.entity.DingConfig;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-12
+ */
+public interface IDingConfigService extends IService<DingConfig> {
+
+    DingConfig getByServeName(String dingServeName);
+}

+ 3 - 1
src/main/java/com/fdkankan/sale/service/ISysRoleService.java

@@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.fdkankan.sale.vo.request.SysRoleMenuParam;
 import com.fdkankan.sale.vo.request.SysRoleParam;
 
+import java.util.List;
+
 /**
  * <p>
  *  服务类
@@ -24,5 +26,5 @@ public interface ISysRoleService extends IService<SysRole> {
 
     void giveMenu(SysRoleMenuParam param);
 
-    SysRole getByRoleType(Integer roleType);
+    List<SysRole> getByRoleType(Integer roleType);
 }

+ 2 - 0
src/main/java/com/fdkankan/sale/service/ISysUserService.java

@@ -48,4 +48,6 @@ public interface ISysUserService extends IService<SysUser> {
     void delUser(Long id);
 
     void updateUser(SysUserParam param);
+
+    List<SysUser> getByRoleType(Integer roleType);
 }

+ 27 - 0
src/main/java/com/fdkankan/sale/service/impl/DingConfigServiceImpl.java

@@ -0,0 +1,27 @@
+package com.fdkankan.sale.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.sale.entity.DingConfig;
+import com.fdkankan.sale.mapper.IDingConfigMapper;
+import com.fdkankan.sale.service.IDingConfigService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-12
+ */
+@Service
+public class DingConfigServiceImpl extends ServiceImpl<IDingConfigMapper, DingConfig> implements IDingConfigService {
+
+    @Override
+    public DingConfig getByServeName(String dingServeName) {
+        LambdaQueryWrapper<DingConfig> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(DingConfig::getServeName,dingServeName);
+        return this.getOne(wrapper);
+    }
+}

+ 177 - 0
src/main/java/com/fdkankan/sale/service/impl/DingService.java

@@ -0,0 +1,177 @@
+package com.fdkankan.sale.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.sale.common.*;
+import com.fdkankan.sale.entity.DingConfig;
+import com.fdkankan.sale.entity.Repair;
+import com.fdkankan.sale.entity.RepairLog;
+import com.fdkankan.sale.entity.SysUser;
+import com.fdkankan.sale.exception.BusinessException;
+import com.fdkankan.sale.httpClient.client.DingClient;
+import com.fdkankan.sale.httpClient.request.DingMsgReq;
+import com.fdkankan.sale.httpClient.request.OaData;
+import com.fdkankan.sale.service.IDingConfigService;
+import com.fdkankan.sale.service.IRepairService;
+import com.fdkankan.sale.service.ISysUserService;
+import com.fdkankan.sale.util.StatusUtil;
+import com.fdkankan.sale.vo.response.RepairLogVo;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class DingService {
+
+    @Autowired
+    IDingConfigService dingConfigService;
+    @Autowired
+    DingClient dingClient;
+    @Autowired
+    RedisUtil redisUtil;
+    @Autowired
+    FYunFileServiceInterface fYunFileServiceInterface;
+    @Autowired
+    IRepairService repairService;
+    @Autowired
+    RepairInfoService repairInfoService;
+    @Autowired
+    ISysUserService sysUserService;
+
+    private String getAccessToken(){
+        String redisKey = String.format(RedisKeyUtil.dingKeyToken, CacheUtil.dingServeName);
+        if(redisUtil.hasKey(redisKey)){
+            return redisUtil.get(redisKey);
+        }
+
+        DingConfig dingConfig = dingConfigService.getByServeName(CacheUtil.dingServeName);
+        if(dingConfig == null){
+            throw new BusinessException(ResultCode.DING_CONFIG_EMPTY);
+        }
+        JSONObject token = dingClient.getToken(dingConfig.getAppKey(), dingConfig.getAppSecret());
+        Integer errcode = token.getInteger("errcode");
+        if(errcode != 0){
+            throw new BusinessException(ResultCode.DING_CONFIG_ERROR);
+        }
+        String access_token = token.getString("access_token");
+        if(StringUtils.isBlank(access_token)){
+            throw new BusinessException(ResultCode.DING_CONFIG_ERROR);
+        }
+
+        redisUtil.set(redisKey,access_token,7200);
+        return access_token;
+
+    }
+
+    private String getUserIdByPhone(String phone){
+        String redisKey = String.format(RedisKeyUtil.dingKeyUsrId, CacheUtil.dingServeName,phone);
+        if(redisUtil.hasKey(redisKey)){
+            return redisUtil.get(redisKey);
+        }
+        JSONObject userByMobile = dingClient.getUserByMobile(getAccessToken(), phone);
+        Integer errcode = userByMobile.getInteger("errcode");
+        if(errcode != 0){
+            throw new BusinessException(ResultCode.DING_PHONE_ERROR);
+        }
+        String userid = userByMobile.getString("userid");
+        if(StringUtils.isBlank(userid)){
+            throw new BusinessException(ResultCode.DING_PHONE_ERROR);
+        }
+        redisUtil.set(redisKey,userid,60 * 60 * 24 * 30);
+        return userid;
+    }
+
+    public void sendDingMsg(RepairLog repairLog){
+        try {
+            DingConfig dingConfig = dingConfigService.getByServeName(CacheUtil.dingServeName);
+            if(dingConfig == null){
+                throw new BusinessException(ResultCode.DING_CONFIG_EMPTY);
+            }
+            List<String> phones = new ArrayList<>();
+
+            OaData oaData = getOaData(repairLog);
+            Long sysUserId = oaData.getSysUserId();
+            SysUser sysUser = sysUserService.getById(sysUserId);
+            if(StringUtils.isNotBlank(sysUser.getDingAccount())){
+                phones.add(sysUser.getDingAccount());
+
+            }
+            if(repairLog.getRepairStatus().equals(RepairStatusProcessComing.TO_BE_PREPARED.getStatus())){
+                List<SysUser> userList = sysUserService.getByRoleType(6);
+                for (SysUser user : userList) {
+                    if(StringUtils.isNotBlank(user.getDingAccount())){
+                        phones.add(user.getDingAccount());
+                    }
+                }
+            }
+            if(phones.size() <=0){
+                throw new BusinessException(ResultCode.DING_SEND_ERROR);
+            }
+            DingMsgReq dingMsgReq = new DingMsgReq();
+            dingMsgReq.setAgent_id(dingConfig.getAgentId());
+            List<String> userIdList = new ArrayList<>();
+            for (String phone : phones) {
+                String userId = getUserIdByPhone(phone);
+                userIdList.add(userId);
+            }
+            if(userIdList.size() <=0){
+                throw new BusinessException(ResultCode.DING_SEND_ERROR);
+            }
+            String userIds = String.join(",", userIdList);
+
+            String oaPath = String.format(FilePath.oss_ding_path, CacheUtil.dingServeName,"OA.json");
+            String fileContent = fYunFileServiceInterface.getFileContent(oaPath);
+            if(StringUtils.isBlank(fileContent)){
+                throw new BusinessException(ResultCode.DING_SEND_ERROR);
+            }
+
+            fileContent = fileContent.replaceAll("\\{mailUrl}",oaData.getMailUrl());
+            fileContent = fileContent.replaceAll("\\{repairId}",oaData.getRepairId());
+            fileContent = fileContent.replaceAll("\\{repairCreateTime}",oaData.getRepairStatusStr());
+            fileContent = fileContent.replaceAll("\\{cameraTypeStr}",oaData.getCameraTypeStr());
+            fileContent = fileContent.replaceAll("\\{cameraSnCode}",oaData.getCameraSnCode());
+            fileContent = fileContent.replaceAll("\\{warrantyTypeStr}",oaData.getWarrantyTypeStr());
+            fileContent = fileContent.replaceAll("\\{repairStatusStr}",oaData.getRepairStatusStr());
+            fileContent = fileContent.replaceAll("\\{description}",oaData.getDescription());
+            dingMsgReq.setUserid_list(userIds);
+            dingMsgReq.setMsg(JSONObject.parseObject(fileContent));
+            dingMsgReq.setTo_all_user(false);
+            dingClient.sendMsg(getAccessToken(),dingMsgReq);
+        }catch (Exception e){
+            log.error("ding--send--msg,error:",e);
+        }
+
+
+    }
+
+    private OaData getOaData(RepairLog repairLog){
+        Repair repair = repairService.getById(repairLog.getRepairId());
+
+        OaData oaData = new OaData();
+        oaData.setMailUrl(CacheUtil.mainUrl);
+        oaData.setRepairId(repairLog.getRepairId());
+        oaData.setRepairCreateTime(repair.getCreateTime());
+        oaData.setCameraTypeStr(StatusUtil.getCameraName(repair.getCameraType()));
+        oaData.setCameraSnCode(repair.getCameraSnCode());
+        oaData.setWarrantyTypeStr(StatusUtil.getWarrantyType(repair.getWarrantyType()));
+        oaData.setRepairStatusStr(RepairStatusProcessComing.getByStatus(repair.getStatus()).getMsg());
+
+        RepairLogVo repairLogVo = new RepairLogVo();
+        BeanUtils.copyProperties(repairLog,repairLogVo);
+        RepairLogVo nextStepVo = repairInfoService.getNextStepVo(repairLogVo);
+        oaData.setDescription(nextStepVo.getSubTitle());
+        oaData.setSysUserId(nextStepVo.getSysUserId());
+        return oaData;
+    }
+
+
+}

+ 3 - 1
src/main/java/com/fdkankan/sale/service/impl/RepairInfoService.java

@@ -18,6 +18,7 @@ import com.fdkankan.sale.vo.response.*;
 
 import com.fdkankan.sale.exception.BusinessException;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.math3.optim.nonlinear.scalar.gradient.NonLinearConjugateGradientOptimizer;
 import org.omg.CORBA.INTERNAL;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -179,7 +180,7 @@ public class RepairInfoService {
         return repairLogListVo;
     }
 
-    private RepairLogVo getNextStepVo(RepairLogVo repairLogVo) {
+    public RepairLogVo getNextStepVo(RepairLogVo repairLogVo) {
         RepairLogVo log = new RepairLogVo();
         log.setRepairId(repairLogVo.getRepairId());
         log.setRepairStatus( repairLogVo.getRepairStatus() );
@@ -247,6 +248,7 @@ public class RepairInfoService {
             }
             SysUser sysUser = sysUserService.getById(sysUserId);
             if(sysUser != null){
+                log.setSysUserId(sysUserId);
                 log.setSysUserName(sysUser.getUserName());
                 subTitle = subTitle.replace("{userName}",sysUser.getNickName());
                 log.setSysUserName(sysUser.getNickName());

+ 3 - 0
src/main/java/com/fdkankan/sale/service/impl/RepairLogServiceImpl.java

@@ -29,6 +29,8 @@ public class RepairLogServiceImpl extends ServiceImpl<IRepairLogMapper, RepairLo
 
     @Autowired
     IRepairService repairService;
+    @Autowired
+    DingService dingService;
 
     /**
      *      * status 0待接单,10待检测,20待报价,30待确认,40已取消,50待备料,60维修中,70待测试,
@@ -44,6 +46,7 @@ public class RepairLogServiceImpl extends ServiceImpl<IRepairLogMapper, RepairLo
         repairLog.setOldRepairStatus(oldRepairStatus);
         this.save(repairLog);
         repairService.updateRepairStatus(repairId,repairStatus);
+        dingService.sendDingMsg(repairLog);
         return repairLog;
     }
 

+ 3 - 2
src/main/java/com/fdkankan/sale/service/impl/SysRoleServiceImpl.java

@@ -23,6 +23,7 @@ import org.springframework.util.StringUtils;
 
 import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
 
 /**
  * <p>
@@ -85,9 +86,9 @@ public class SysRoleServiceImpl extends ServiceImpl<ISysRoleMapper, SysRole> imp
     }
 
     @Override
-    public SysRole getByRoleType(Integer roleType) {
+    public List<SysRole> getByRoleType(Integer roleType) {
         LambdaQueryWrapper<SysRole> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(SysRole::getRoleType,roleType);
-        return this.getOne(wrapper);
+        return this.list(wrapper);
     }
 }

+ 12 - 0
src/main/java/com/fdkankan/sale/service/impl/SysUserServiceImpl.java

@@ -241,4 +241,16 @@ public class SysUserServiceImpl extends ServiceImpl<ISysUserMapper, SysUser> imp
         wrapper.set(SysUser::getStatus,param.getStatus());
         this.update(wrapper);
     }
+
+    @Override
+    public List<SysUser> getByRoleType(Integer roleType) {
+        List<SysRole> roles = roleService.getByRoleType(roleType);
+        if(roles == null || roles.size()<=0){
+            return null;
+        }
+        List<Long> collect = roles.stream().map(SysRole::getId).collect(Collectors.toList());
+        LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(SysUser::getRoleId,collect);
+        return this.list(wrapper);
+    }
 }

+ 2 - 0
src/main/java/com/fdkankan/sale/vo/request/SysUserParam.java

@@ -14,5 +14,7 @@ public class SysUserParam extends RequestBase {
     private Integer status;
     private String newPassword;
     private String oldPassword;
+    private String dingAccount;
+
 
 }

+ 41 - 0
src/main/resources/OA.json

@@ -0,0 +1,41 @@
+{
+  "msgtype": "oa",
+  "oa": {
+    "pc_message_url": "dingtalk://dingtalkclient/page/link?url={mailUrl}/aftermarketmp/#/work/detail/{repairId}&pc_slide=false",
+    "head": {
+      "bgcolor": "FFBBBBBB"
+    },
+    "body": {
+      "form": [
+        {
+          "key": "工单号:",
+          "value": "{repairId}"
+        },
+        {
+          "key": "报修日期:",
+          "value": "{repairCreateTime}"
+        },
+        {
+          "key": "相机类型:",
+          "value": "{cameraTypeStr}"
+        },
+        {
+          "key": "SN码:",
+          "value": "{cameraSnCode}"
+        },
+        {
+          "key": "保修类型:",
+          "value": "{warrantyTypeStr}"
+        },
+        {
+          "key": "状态:",
+          "value": "{repairStatusStr}"
+        },
+        {
+          "key": "说明:",
+          "value": "{description}"
+        }
+      ]
+    }
+  }
+}

+ 2 - 0
src/main/resources/bootstrap.yml

@@ -10,6 +10,8 @@ spring:
 logging:
   config: classpath:logback-spring.xml
 
+ding:
+  serve_name: sale
 #mybatis-plus:
 #  configuration:
 #    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启sql日志

+ 5 - 0
src/main/resources/mapper/sale/DingConfigMapper.xml

@@ -0,0 +1,5 @@
+<?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.fdkankan.sale.mapper.IDingConfigMapper">
+
+</mapper>