Browse Source

Merge branch 'master' of http://git.jihengcc.cn/daili/smart-factory

guozx 3 years ago
parent
commit
a6dc45eb87
46 changed files with 1121 additions and 164 deletions
  1. 9 0
      application-facade/src/main/java/com/factory/controller/web/FirstArticleController.java
  2. 8 0
      application-facade/src/main/java/com/factory/controller/web/PreventMistakeController.java
  3. 36 30
      application-facade/src/main/java/com/factory/util/client/PushWxMessage.java
  4. 20 2
      application-facade/src/main/java/com/factory/util/client/TemplateEntry.java
  5. 3 0
      application-facade/src/main/java/com/factory/web/entity/fa/FirstArticleItemResult.java
  6. 7 0
      application-facade/src/main/java/com/factory/web/entity/fa/res/FaPlanRes.java
  7. 3 0
      application-facade/src/main/java/com/factory/web/entity/fa/res/FaWorkshopNoGoListRes.java
  8. 3 1
      application-facade/src/main/java/com/factory/web/entity/pm/OnsiteItemResult.java
  9. 2 2
      application-facade/src/main/java/com/factory/web/entity/pm/req/EditItemResultListReq.java
  10. 5 2
      application-facade/src/main/java/com/factory/web/entity/pm/req/EditItemResultReq.java
  11. 3 0
      application-facade/src/main/java/com/factory/web/entity/pm/res/PmItemNoGoListRes.java
  12. 7 0
      application-facade/src/main/java/com/factory/web/entity/pm/res/PmPlanRes.java
  13. 3 0
      application-facade/src/main/java/com/factory/web/entity/pm/res/PmWorkshopNoGoListRes.java
  14. 7 0
      application-facade/src/main/java/com/factory/web/mapper/fa/FirstArticleMapper.java
  15. 7 3
      application-facade/src/main/java/com/factory/web/mapper/pm/PreventMistakeMapper.java
  16. 8 0
      application-facade/src/main/java/com/factory/web/service/fa/FirstArticleService.java
  17. 73 0
      application-facade/src/main/java/com/factory/web/service/impl/fa/FirstArticleServiceImpl.java
  18. 78 31
      application-facade/src/main/java/com/factory/web/service/impl/pm/PreventMistakeServiceImpl.java
  19. 8 0
      application-facade/src/main/java/com/factory/web/service/pm/PreventMistakeService.java
  20. 3 0
      application-facade/src/main/java/com/factory/wx/entity/req/AbnormalDetailReq.java
  21. 34 0
      application-facade/src/main/java/com/factory/wx/entity/req/SendMsgReq.java
  22. 24 0
      application-facade/src/main/java/com/factory/wx/mapper/AbnormalStatisticsMapper.java
  23. 9 0
      application-facade/src/main/java/com/factory/wx/service/WxService.java
  24. 59 40
      application-facade/src/main/java/com/factory/wx/service/impl/AbnormalStatisticsServiceImpl.java
  25. 21 1
      application-facade/src/main/java/com/factory/wx/service/impl/PlanPassFAServiceImpl.java
  26. 24 6
      application-facade/src/main/java/com/factory/wx/service/impl/PlanPassPMServiceImpl.java
  27. 56 0
      application-facade/src/main/java/com/factory/wx/service/impl/WxServiceImpl.java
  28. 3 0
      application-facade/src/main/resources/application-dev.yml
  29. 3 0
      application-facade/src/main/resources/application-test.yml
  30. 3 0
      application-facade/src/main/resources/application.yml
  31. 173 30
      application-facade/src/main/resources/mapper/AbnormalStatisticsMapper.xml
  32. 14 2
      application-facade/src/main/resources/mapper/FirstArticleMapper.xml
  33. 23 4
      application-facade/src/main/resources/mapper/PreventMistakeMapper.xml
  34. 33 0
      application-task/src/main/java/com/jihengbel/intelligent/applicationtask/common/HttpCilentUntil.java
  35. 73 0
      application-task/src/main/java/com/jihengbel/intelligent/applicationtask/entry/SendMsgReq.java
  36. 78 0
      application-task/src/main/java/com/jihengbel/intelligent/applicationtask/entry/TemplateEntry.java
  37. 13 0
      application-task/src/main/java/com/jihengbel/intelligent/applicationtask/init/FirstRemindJob.java
  38. 13 0
      application-task/src/main/java/com/jihengbel/intelligent/applicationtask/init/OnsiteRemindJob.java
  39. 13 0
      application-task/src/main/java/com/jihengbel/intelligent/applicationtask/model/UserMapper.java
  40. 18 0
      application-task/src/main/java/com/jihengbel/intelligent/applicationtask/service/MsgService.java
  41. 19 5
      application-task/src/main/java/com/jihengbel/intelligent/applicationtask/service/impl/FirstTaskServiceImp.java
  42. 80 0
      application-task/src/main/java/com/jihengbel/intelligent/applicationtask/service/impl/MsgServiceImpl.java
  43. 19 5
      application-task/src/main/java/com/jihengbel/intelligent/applicationtask/service/impl/OnsiteTaskServiceImp.java
  44. 3 0
      application-task/src/main/resources/application-test.properties
  45. 6 0
      application-task/src/main/resources/application.properties
  46. 14 0
      application-task/src/main/resources/mappers/UserMapper.xml

+ 9 - 0
application-facade/src/main/java/com/factory/controller/web/FirstArticleController.java

@@ -30,6 +30,7 @@ import com.factory.web.entity.fa.res.UserListRes;
 import com.factory.web.entity.pm.OnsiteApprovalPlan;
 import com.factory.web.entity.pm.req.PmPlanPauseFlagReq;
 import com.factory.web.entity.pm.req.SearchPmPlanReq;
+import com.factory.web.entity.pm.req.SearchTaskReq;
 import com.factory.web.service.fa.FirstArticleService;
 import com.factory.web.service.pm.PreventMistakeService;
 
@@ -222,5 +223,13 @@ public class FirstArticleController {
 	public ResponseBean<List<FaCalendarRes>> getFaCalendarList(@RequestBody SearchFaCalendarReq req) {
 		return ResponseBeanBuilder.ok(firstArticleService.getFaCalendarList(req));
 	}
+	
+	@ApiOperation(value = "重检前清空之前的点检结果")
+	@PostMapping("/setFaRepeatResult")
+	@ApiOperationSupport(order = 22)
+	public ResponseBean setFaRepeatResult(@RequestBody SearchFaTaskReq req) {
+		firstArticleService.setFaRepeatResult(req.getFirstArticleTaskId());
+		return ResponseBeanBuilder.ok();
+	}
 
 }

+ 8 - 0
application-facade/src/main/java/com/factory/controller/web/PreventMistakeController.java

@@ -235,6 +235,14 @@ public class PreventMistakeController {
 	public ResponseBean<List<AbnormalTaskInfoRes>> getAbnormalList(@RequestBody SearchAbnormalListReq req) {
 		return preventMistakeService.getAbnormalList(req);
 	}
+	
+	@ApiOperation(value = "重检前清空之前的点检结果")
+	@PostMapping("/setPmRepeatResult")
+	@ApiOperationSupport(order = 25)
+	public ResponseBean setPmRepeatResult(@RequestBody SearchTaskReq req) {
+		preventMistakeService.setPmRepeatResult(req.getOnsiteTaskId());
+		return ResponseBeanBuilder.ok();
+	}
 
 	// 计划审批、任务审批,都在小程序端做
 }

+ 36 - 30
application-facade/src/main/java/com/factory/util/client/PushWxMessage.java

@@ -8,38 +8,44 @@ import java.util.Map;
 
 public class PushWxMessage {
 
-   public static String  sendMessage(AppEntry appinfo,TemplateEntry template){
-     try {
-         Map params = new HashMap();
-         params.put("secret", appinfo.getSecret());
-         params.put("appid", appinfo.getAppId());
-         params.put("grant_type", "client_credential");
-         String result = HttpCilentUntil.httpGetToString(
-                 "https://api.weixin.qq.com/cgi-bin/token", params);
-         JSONObject jsonObject = JSON.parseObject(result);
-         String access_token = jsonObject.get("access_token").toString();
-         String pushUrl = new StringBuffer("https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=").append(access_token).toString();
-         result = HttpCilentUntil.httpJsonToString(pushUrl, JSON.toJSONString(template));
-         jsonObject = JSON.parseObject(result);
-         String errCode = jsonObject.get("errcode").toString();
-         String errMsg = jsonObject.get("errmsg").toString();
-         System.out.println(errCode);
-         return errCode;
-     }catch (Throwable e){
-         e.printStackTrace();
-         return "-1";
-     }
-   }
+    public static String sendMessage(AppEntry appinfo, TemplateEntry template) {
+        try {
+            Map params = new HashMap();
+            params.put("secret", appinfo.getSecret());
+            params.put("appid", appinfo.getAppId());
+            params.put("grant_type", "client_credential");
+            String result = HttpCilentUntil.httpGetToString(
+                    "https://api.weixin.qq.com/cgi-bin/token", params);
+            JSONObject jsonObject = JSON.parseObject(result);
+            String access_token = jsonObject.get("access_token").toString();
+            String pushUrl = new StringBuffer("https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=").append(access_token).toString();
+            result = HttpCilentUntil.httpJsonToString(pushUrl, JSON.toJSONString(template));
+            jsonObject = JSON.parseObject(result);
+            String errCode = jsonObject.get("errcode").toString();
+            String errMsg = jsonObject.get("errmsg").toString();
+            System.out.println(errCode);
+            return errCode;
+        } catch (Throwable e) {
+            e.printStackTrace();
+            return "-1";
+        }
+    }
 
     public static void main(String[] args) {
-        AppEntry app=AppEntry.builder().appId("wxfd6e42e05b91163c").secret("7c4e39a33bf8b66beb919b9ad0a15832").build();
-        HashMap<String,ValEntry> dataMap=new HashMap();
-        dataMap.put("thing1",ValEntry.builder().value("this is one").build());
-        dataMap.put("thing2",ValEntry.builder().value("this is two").build());
-        dataMap.put("time3",ValEntry.builder().value("2021-07-23 20:00").build());
-        dataMap.put("thing4",ValEntry.builder().value("Bella").build());
-        TemplateEntry tpl=TemplateEntry.builder().template_id("3RatcsOA-T0Dsgevr-1UGvYzZvhS0UY9A86fnTFax50").touser("oc6xx5Z4DGNuRYKp7EHANCkq5mII").page("pages/login/index").data(dataMap).build();
-        PushWxMessage.sendMessage(app,tpl);
+        AppEntry app = AppEntry.builder().appId("wxfd6e42e05b91163c").secret("7c4e39a33bf8b66beb919b9ad0a15832").build();
+        HashMap<String, ValEntry> dataMap = new HashMap();
+        dataMap.put("thing1", ValEntry.builder().value("this is one").build());
+        dataMap.put("thing2", ValEntry.builder().value("this is two").build());
+        dataMap.put("time3", ValEntry.builder().value("2021-07-23 20:00").build());
+        dataMap.put("thing4", ValEntry.builder().value("Bella").build());
+        TemplateEntry tpl = TemplateEntry.builder()
+                .template_id("3RatcsOA-T0Dsgevr-1UGvYzZvhS0UY9A86fnTFax50")
+                .touser("oc6xx5Z4DGNuRYKp7EHANCkq5mII")
+                .page("pages/login/index")
+//                .miniprogram_state("trial")
+                .data(dataMap)
+                .build();
+        PushWxMessage.sendMessage(app, tpl);
     }
 
 }

+ 20 - 2
application-facade/src/main/java/com/factory/util/client/TemplateEntry.java

@@ -8,10 +8,28 @@ import java.util.HashMap;
 @Data
 @Builder
 public class TemplateEntry {
-    private String touser; //openid
+    /**
+     * 模板id
+     */
     private String template_id; //模板id
-    private HashMap<String,ValEntry> data; //模板数据
+    /**
+     * 跳转小程序页面
+     */
     private String page;//不是必填
+    /**
+     * 跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
+     */
     private String miniprogram_state; //不是必填
+    /**
+     * 小程序语言,默认中文
+     */
     private String lang;//不是必填
+    /**
+     * 接收者openid
+     */
+    private String touser; //openid
+    /**
+     * 模板数据
+     */
+    private HashMap<String, ValEntry> data; //模板数据
 }

+ 3 - 0
application-facade/src/main/java/com/factory/web/entity/fa/FirstArticleItemResult.java

@@ -46,6 +46,9 @@ public class FirstArticleItemResult implements Serializable {
 
 	@ApiModelProperty(value = "0通过 1巡检不通过 2没有巡检")
 	private Integer result;
+	
+	@ApiModelProperty(value = "task整体提交时,备份result字段的值。 0通过 1巡检不通过 2没有巡检")
+	private Integer resultBak;
 
 	@TableField(fill = FieldFill.INSERT)
 	@ApiModelProperty(value = "创建人")

+ 7 - 0
application-facade/src/main/java/com/factory/web/entity/fa/res/FaPlanRes.java

@@ -7,6 +7,7 @@ import java.util.List;
 import com.factory.web.entity.fa.FirstArticleCalendar;
 import com.factory.web.entity.fa.FirstArticleTitle;
 import com.factory.web.entity.fa.FirstArticleWorkshop;
+import com.factory.web.service.impl.FileEntry;
 import com.fasterxml.jackson.annotation.JsonInclude;
 
 import io.swagger.annotations.ApiModel;
@@ -50,5 +51,11 @@ public class FaPlanRes implements Serializable {
 
 	@ApiModelProperty(value = "工作站及巡检内容")
 	private List<FirstArticleWorkshop> firstArticleWorkshopList;
+	
+//	@ApiModelProperty(value = "文件信息")
+//	private FileEntry fileEntry;
+	
+	@ApiModelProperty(value = "文件名")
+	private String fileNm;
 
 }

+ 3 - 0
application-facade/src/main/java/com/factory/web/entity/fa/res/FaWorkshopNoGoListRes.java

@@ -31,4 +31,7 @@ public class FaWorkshopNoGoListRes implements Serializable {
 	@ApiModelProperty(value = "工作站名称")
 	private String wsName;
 	
+	@ApiModelProperty(value = "0没完成 1全部完成")
+	private Integer allCheckFlag;
+	
 }

+ 3 - 1
application-facade/src/main/java/com/factory/web/entity/pm/OnsiteItemResult.java

@@ -1,7 +1,6 @@
 package com.factory.web.entity.pm;
 
 import java.io.Serializable;
-import java.time.LocalDate;
 import java.time.LocalDateTime;
 
 import com.baomidou.mybatisplus.annotation.FieldFill;
@@ -42,6 +41,9 @@ public class OnsiteItemResult implements Serializable {
 	@ApiModelProperty(value = "0通过 1巡检不通过 2没有巡检")
 	private Integer result;
 	
+	@ApiModelProperty(value = "task整体提交时,备份result字段的值。 0通过 1巡检不通过 2没有巡检")
+	private Integer resultBak;
+	
 	@ApiModelProperty(value = "异常信息")
 	private String abnormal;
 	

+ 2 - 2
application-facade/src/main/java/com/factory/web/entity/pm/req/EditItemResultListReq.java

@@ -25,8 +25,8 @@ import lombok.NoArgsConstructor;
 @ApiModel("")
 public class EditItemResultListReq {
 	
-	@ApiModelProperty(value = "任务id")
-	private Long onsiteTaskId;
+//	@ApiModelProperty(value = "任务id")
+//	private Long onsiteTaskId;
 	
 //	@ApiModelProperty(value = "工作站id")
 //	private Long workshopId;

+ 5 - 2
application-facade/src/main/java/com/factory/web/entity/pm/req/EditItemResultReq.java

@@ -22,9 +22,12 @@ import lombok.NoArgsConstructor;
 @JsonInclude()
 @ApiModel("")
 public class EditItemResultReq {
+	
+	@ApiModelProperty(value = "检查结果id")
+	private Long id;
 
-	@ApiModelProperty(value = "巡检项目id")
-	private Long onsiteItemId;
+//	@ApiModelProperty(value = "巡检项目id")
+//	private Long onsiteItemId;
 
 	@ApiModelProperty(value = "0通过 1巡检不通过 2没有巡检")
 	private Integer result;

+ 3 - 0
application-facade/src/main/java/com/factory/web/entity/pm/res/PmItemNoGoListRes.java

@@ -25,6 +25,9 @@ import lombok.NoArgsConstructor;
 @JsonInclude()
 @ApiModel("")
 public class PmItemNoGoListRes implements Serializable {
+	
+	@ApiModelProperty(value = "检查结果id")
+	private Long id;
 
 	@ApiModelProperty(value = "巡检项目id")
 	private Long onsiteItemId;

+ 7 - 0
application-facade/src/main/java/com/factory/web/entity/pm/res/PmPlanRes.java

@@ -7,6 +7,7 @@ import java.util.List;
 import com.factory.web.entity.pm.OnsiteCalendar;
 import com.factory.web.entity.pm.OnsiteTitle;
 import com.factory.web.entity.pm.OnsiteWorkshop;
+import com.factory.web.service.impl.FileEntry;
 import com.fasterxml.jackson.annotation.JsonInclude;
 
 import io.swagger.annotations.ApiModel;
@@ -53,5 +54,11 @@ public class PmPlanRes implements Serializable {
 
 	@ApiModelProperty(value = "工作站及巡检内容")
 	private List<OnsiteWorkshop> onsiteWorkshopList;
+	
+//	@ApiModelProperty(value = "文件信息")
+//	private FileEntry fileEntry;
+	
+	@ApiModelProperty(value = "文件名")
+	private String fileNm;
 
 }

+ 3 - 0
application-facade/src/main/java/com/factory/web/entity/pm/res/PmWorkshopNoGoListRes.java

@@ -31,4 +31,7 @@ public class PmWorkshopNoGoListRes implements Serializable {
 	@ApiModelProperty(value = "工作站名称")
 	private String wsName;
 	
+	@ApiModelProperty(value = "0没完成 1全部完成")
+	private Integer allCheckFlag;
+	
 }

+ 7 - 0
application-facade/src/main/java/com/factory/web/mapper/fa/FirstArticleMapper.java

@@ -164,4 +164,11 @@ public interface FirstArticleMapper extends BaseMapper<BentelerPlan> {
      */
     public List<FaCalendarRes> getFaCalendarList(@Param("req") SearchFaCalendarReq req);
     
+    /**
+     * 取得重检项目下,未完成重检的数量
+     * @param req
+     * @return 未完成重检的数量
+     */
+    public int getFaRepeatItemResultCount(@Param("req") SearchFaWsItemResultCountReq req);
+    
 }

+ 7 - 3
application-facade/src/main/java/com/factory/web/mapper/pm/PreventMistakeMapper.java

@@ -217,8 +217,12 @@ public interface PreventMistakeMapper extends BaseMapper<BentelerPlan> {
      * @return PAD端工作站
      */
     public List<OnsiteWorkshop> getPmWorkshopListForPad(@Param("req") SearchPmAllCheckFlagReq req);
-    
-    
-    
+
+    /**
+     * 取得重检项目下,未完成重检的数量
+     * @param req
+     * @return 未完成重检的数量
+     */
+    public int getPmRepeatItemResultCount(@Param("req") SearchPmWsAllCheckFlagReq req);
     
 }

+ 8 - 0
application-facade/src/main/java/com/factory/web/service/fa/FirstArticleService.java

@@ -246,4 +246,12 @@ public interface FirstArticleService extends IService<BentelerPlan> {
 	ResponseBean<FileRes> exportFaCheckRecordList(SearchFaCheckRecordListReq req);
 
 	ResponseBean<FileRes> exportInitialPlanDetails(exportInitialPlanDetailsReq req);
+	
+	/**
+     * task二级审批不通过的,即为重检,此时将点检结果item_result为不通过的1都改成成-1,这样重检时相当于重新开始,没有之前首次点检的结果
+     *
+     * @param firstArticleTaskId
+     * @return
+     */
+    public void setFaRepeatResult(long firstArticleTaskId);
 }

+ 73 - 0
application-facade/src/main/java/com/factory/web/service/impl/fa/FirstArticleServiceImpl.java

@@ -28,18 +28,24 @@ import com.factory.web.entity.pm.res.ApprovalUserRes;
 import com.factory.web.entity.vo.req.exportInitialPlanDetailsReq;
 import com.factory.web.mapper.fa.FirstArticleMapper;
 import com.factory.web.service.BentelerPlanService;
+import com.factory.web.service.FileService;
 import com.factory.web.service.fa.*;
+import com.factory.web.service.impl.FileEntry;
 import com.factory.web.service.pm.OnsiteApprovalPlanService;
 import com.factory.web.service.pm.PlanBindService;
 import com.factory.web.service.pm.PreventMistakeService;
+import com.factory.wx.entity.req.SendMsgReq;
+import com.factory.wx.service.WxService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.io.*;
+import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
@@ -101,6 +107,12 @@ public class FirstArticleServiceImpl extends ServiceImpl<FirstArticleMapper, Ben
 
     @Autowired
     private PlanBindService planBindService;
+    
+    @Autowired
+    private FileService fileService;
+
+    @Autowired
+    private WxService wxService;
 
     /**
      * 新建防错计划
@@ -188,6 +200,7 @@ public class FirstArticleServiceImpl extends ServiceImpl<FirstArticleMapper, Ben
                         .valFlag(firstArticleItemReq.getValFlag())
                         .valUp(firstArticleItemReq.getValUp())
                         .valDown(firstArticleItemReq.getValDown())
+                        .valUnit(firstArticleItemReq.getValUnit())                 
                         .valOk(firstArticleItemReq.getValOk())
                         .valDesc(firstArticleItemReq.getValDesc())
                         .levelInfo(firstArticleItemReq.getLevelInfo())
@@ -213,6 +226,18 @@ public class FirstArticleServiceImpl extends ServiceImpl<FirstArticleMapper, Ben
                     .status(0) // 0未审批
                     .build();
             onsiteApprovalPlanService.save(onsiteApprovalPlan);
+
+//            //向下一级别发送提醒
+//            Date date = new Date();
+//            SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
+//            //发送微信消息
+//            wxService.sendWechatMessage(SendMsgReq.builder()
+//                    .toUserId(approvalUserRes.getUserId())
+//                    .title("计划审批提醒")
+//                    .content("您有待审批的新建计划,请登录小程序查看【计划审批】")
+//                    .endTime(ft.format(date))
+//                    .fromUserId(plan.getCreatedUserId())
+//                    .build());
         }
 
         return ResponseBeanBuilder.ok();
@@ -275,6 +300,13 @@ public class FirstArticleServiceImpl extends ServiceImpl<FirstArticleMapper, Ben
             FirstArticleTitleBlob firstArticleTitleBlob = firstArticleTitleBlobService.getOne(new LambdaQueryWrapper<FirstArticleTitleBlob>()
                     .eq(FirstArticleTitleBlob::getBentelerPlanId, req.getBentelerPlanId()));
             faPlanRes.setFirstArticleTitle((FirstArticleTitle) this.byteArrayToObject(firstArticleTitleBlob.getTitleContent()));
+            
+            /* 取得文件信息 */
+            FileEntry fileEntry = fileService.getById(faPlanRes.getFirstArticleTitle().getUploadAttachmentId());
+            if (fileEntry != null) {
+            	faPlanRes.setFileNm(fileEntry.getFileNm());
+            }
+            
         } catch (Exception e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
@@ -401,6 +433,7 @@ public class FirstArticleServiceImpl extends ServiceImpl<FirstArticleMapper, Ben
                             .valFlag(firstArticleItemReq.getValFlag())
                             .valUp(firstArticleItemReq.getValUp())
                             .valDown(firstArticleItemReq.getValDown())
+                            .valUnit(firstArticleItemReq.getValUnit())
                             .valOk(firstArticleItemReq.getValOk())
                             .valDesc(firstArticleItemReq.getValDesc())
                             .levelInfo(firstArticleItemReq.getLevelInfo())
@@ -861,6 +894,15 @@ public class FirstArticleServiceImpl extends ServiceImpl<FirstArticleMapper, Ben
         /* 取得task下的所有条目检查结果 */
         List<FirstArticleItemResult> firstArticleItemResultList = firstArticleItemResultService.list(Wrappers.<FirstArticleItemResult>lambdaQuery()
                 .eq(FirstArticleItemResult::getFirstArticleTaskId, firstArticleTaskId));
+        
+        /* task提交时,备份result到resultBak */
+        for (FirstArticleItemResult firstArticleItemResult : firstArticleItemResultList) {
+        	FirstArticleItemResult fair = FirstArticleItemResult.builder()
+                    .id(firstArticleItemResult.getId())
+                    .resultBak(firstArticleItemResult.getResult())
+                    .build();
+        	firstArticleItemResultService.updateById(fair);
+        }
 
         boolean flag = true; // true表示巡检项目都通过,false表示巡检项目有不通过的
         for (FirstArticleItemResult firstArticleItemResult : firstArticleItemResultList) {
@@ -923,6 +965,19 @@ public class FirstArticleServiceImpl extends ServiceImpl<FirstArticleMapper, Ben
     @Override
     public ResponseBean<List<FaWorkshopNoGoListRes>> getFaWorkshopNoGoList(SearchFaWorkshopNoGoListReq req) {
         List<FaWorkshopNoGoListRes> faWorkshopNoGoList = firstArticleMapper.getFaWorkshopNoGoList(req);
+        SearchFaWsItemResultCountReq searchFaWsItemResultCountReq = null;
+        for (FaWorkshopNoGoListRes faWorkshop : faWorkshopNoGoList) {
+        	searchFaWsItemResultCountReq = new SearchFaWsItemResultCountReq();
+            searchFaWsItemResultCountReq.setFirstArticleTaskId(req.getFirstArticleTaskId());
+            searchFaWsItemResultCountReq.setWorkshopId(faWorkshop.getWorkshopId());
+            int itemResultCount = firstArticleMapper.getFaRepeatItemResultCount(searchFaWsItemResultCountReq);
+            if (itemResultCount == 0) {
+            	faWorkshop.setAllCheckFlag(1);
+            } else {
+            	faWorkshop.setAllCheckFlag(0);
+            }
+        }
+        
         return ResponseBeanBuilder.ok(faWorkshopNoGoList, Function.identity());
     }
 
@@ -1475,6 +1530,24 @@ public class FirstArticleServiceImpl extends ServiceImpl<FirstArticleMapper, Ben
         List<FaCalendarRes> faCalendarList = firstArticleMapper.getFaCalendarList(req);
         return faCalendarList;
     }
+    
+    
+    /**
+     * task二级审批不通过的,即为重检,此时将点检结果item_result为不通过的1都改成成-1,这样重检时相当于重新开始,没有之前首次点检的结果
+     *
+     * @param firstArticleTaskId
+     * @return
+     */
+    @Override
+    public void setFaRepeatResult(long firstArticleTaskId) {
+    	LambdaUpdateWrapper<FirstArticleItemResult> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+        lambdaUpdateWrapper.eq(FirstArticleItemResult::getFirstArticleTaskId, firstArticleTaskId)
+                .eq(FirstArticleItemResult::getResult, 1)
+                .set(FirstArticleItemResult::getResult, -1);
+        firstArticleItemResultService.update(lambdaUpdateWrapper);
+    }
+    
+    
 
     /**
      * Object转成byte[]

+ 78 - 31
application-facade/src/main/java/com/factory/web/service/impl/pm/PreventMistakeServiceImpl.java

@@ -4,10 +4,14 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.function.Function;
 
+import com.factory.wx.entity.req.SendMsgReq;
+import com.factory.wx.service.WxService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -23,7 +27,9 @@ import com.factory.base.entity.aggregates.ResponseBean;
 import com.factory.base.entity.enumPo.PlanType;
 import com.factory.base.entity.po.benteler.BentelerPlan;
 import com.factory.base.util.res.ResponseBeanBuilder;
+import com.factory.web.entity.fa.FirstArticleItemResult;
 import com.factory.web.entity.fa.FirstArticleWorkshop;
+import com.factory.web.entity.fa.req.EditFaItemResultReq;
 import com.factory.web.entity.pm.OnsiteApprovalPlan;
 import com.factory.web.entity.pm.OnsiteApprovalTask;
 import com.factory.web.entity.pm.OnsiteCalendar;
@@ -85,8 +91,10 @@ import com.factory.web.entity.pm.res.PmTaskRes;
 import com.factory.web.entity.pm.res.PmWorkshopNoGoListRes;
 import com.factory.web.mapper.pm.PreventMistakeMapper;
 import com.factory.web.service.BentelerPlanService;
+import com.factory.web.service.FileService;
 import com.factory.web.service.fa.FirstArticleService;
 import com.factory.web.service.fa.FirstArticleWorkshopService;
+import com.factory.web.service.impl.FileEntry;
 import com.factory.web.service.pm.OnsiteApprovalPlanService;
 import com.factory.web.service.pm.OnsiteApprovalTaskService;
 import com.factory.web.service.pm.OnsiteCalendarService;
@@ -156,6 +164,13 @@ public class PreventMistakeServiceImpl extends ServiceImpl<PreventMistakeMapper,
 	@Autowired
 	private PlanBindService planBindService;
 	
+	@Autowired
+    private FileService fileService;
+	
+
+	@Autowired
+	private WxService wxService;
+
 
 	/**
 	 * 新建防错计划
@@ -247,6 +262,17 @@ public class PreventMistakeServiceImpl extends ServiceImpl<PreventMistakeMapper,
 					.status(0) // 0未审批
 					.build();
 			onsiteApprovalPlanService.save(onsiteApprovalPlan);
+//			向下一级别发送提醒
+//			Date date = new Date();
+//			SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
+//			//发送微信消息
+//			wxService.sendWechatMessage(SendMsgReq.builder()
+//					.toUserId(approvalUserRes.getUserId())
+//					.title("计划审批提醒")
+//					.content("您有待审批的新建计划,请登录小程序查看【计划审批】")
+//					.endTime(ft.format(date))
+//					.fromUserId(plan.getCreatedUserId())
+//					.build());
 		}
 
 		return ResponseBeanBuilder.ok();
@@ -391,6 +417,13 @@ public class PreventMistakeServiceImpl extends ServiceImpl<PreventMistakeMapper,
 			OnsiteTitleBlob onsiteTitleBlob = onsiteTitleBlobService.getOne(new LambdaQueryWrapper<OnsiteTitleBlob>()
 	    			.eq(OnsiteTitleBlob::getBentelerPlanId, req.getBentelerPlanId()));
 			pmPlanRes.setOnsiteTitle((OnsiteTitle)this.byteArrayToObject(onsiteTitleBlob.getTitleContent()));
+
+			/* 取得文件信息 */
+            FileEntry fileEntry = fileService.getById(pmPlanRes.getOnsiteTitle().getUploadAttachmentId());
+            if (fileEntry != null) {
+            	pmPlanRes.setFileNm(fileEntry.getFileNm());
+            }
+            
 		} catch (Exception e) {
 			// TODO Auto-generated catch block
 			e.printStackTrace();
@@ -883,6 +916,16 @@ public class PreventMistakeServiceImpl extends ServiceImpl<PreventMistakeMapper,
 		/* 取得task下的所有条目检查结果 */
 		List<OnsiteItemResult> onsiteItemResultList = onsiteItemResultService.list(Wrappers.<OnsiteItemResult>lambdaQuery()
                 .eq(OnsiteItemResult::getOnsiteTaskId, req.getOnsiteTaskId()));
+		
+		/* task提交时,备份result到resultBak */
+        for (OnsiteItemResult onsiteItemResult : onsiteItemResultList) {
+        	OnsiteItemResult oir = OnsiteItemResult.builder()
+                    .id(onsiteItemResult.getId())
+                    .resultBak(onsiteItemResult.getResult())
+                    .build();
+        	onsiteItemResultService.updateById(oir);
+        }
+		
 		boolean flag = true; // true表示巡检项目都通过,false表示巡检项目有不通过的
 		for (OnsiteItemResult onsiteItemResult : onsiteItemResultList) {
 			if (onsiteItemResult.getResult() == 1) {
@@ -973,6 +1016,22 @@ public class PreventMistakeServiceImpl extends ServiceImpl<PreventMistakeMapper,
 	@Override
 	public ResponseBean<List<PmWorkshopNoGoListRes>> getPmWorkshopNoGoList(SearchPmWorkshopNoGoListReq req) {
 		List<PmWorkshopNoGoListRes> pmWorkshopNoGoList = preventMistakeMapper.getPmWorkshopNoGoList(req);
+		
+		SearchPmWsAllCheckFlagReq searchPmWsAllCheckFlagReq = null;
+		for (PmWorkshopNoGoListRes pmWorkshop : pmWorkshopNoGoList) {
+			searchPmWsAllCheckFlagReq = new SearchPmWsAllCheckFlagReq();
+			searchPmWsAllCheckFlagReq.setOnsiteTaskId(req.getOnsiteTaskId());
+			searchPmWsAllCheckFlagReq.setWorkshopId(pmWorkshop.getWorkshopId());
+			searchPmWsAllCheckFlagReq.setTypeFlag(req.getTypeFlag());   		
+
+			int itemResultCount = preventMistakeMapper.getPmRepeatItemResultCount(searchPmWsAllCheckFlagReq);
+			if (itemResultCount == 0) {
+				pmWorkshop.setAllCheckFlag(1);
+			} else {
+				pmWorkshop.setAllCheckFlag(0);
+			}
+		}
+
     	return ResponseBeanBuilder.ok(pmWorkshopNoGoList, Function.identity());
 	}
 
@@ -1008,44 +1067,15 @@ public class PreventMistakeServiceImpl extends ServiceImpl<PreventMistakeMapper,
 	 */
 	@Override
 	public ResponseBean editItemResult(EditItemResultListReq req) {
-//		/* 任务和巡检结果记录历史 */
-//		PmTaskRes pmTaskRes = new PmTaskRes();
-//		OnsiteTask onsiteTask = onsiteTaskService.getById(req.getOnsiteTaskId());
-//		pmTaskRes.setOnsiteTaskId(onsiteTask.getId());
-//		pmTaskRes.setOnsiteCalendarId(onsiteTask.getOnsiteCalendarId());
-//		pmTaskRes.setStatus(onsiteTask.getStatus());
-//		pmTaskRes.setTaskTime(onsiteTask.getTaskTime());
-//		pmTaskRes.setRemindTaskFlag(onsiteTask.getRemindTaskFlag());
-//		pmTaskRes.setRemindNoworkFalg(onsiteTask.getRemindNoworkFalg());
-//		List<OnsiteItemResult> onsiteItemResultList = onsiteItemResultService.list(Wrappers.<OnsiteItemResult>lambdaQuery()
-//                .eq(OnsiteItemResult::getOnsiteTaskId, req.getOnsiteTaskId()));
-//		pmTaskRes.setOnsiteItemResultList(onsiteItemResultList);
-//
-//		try {
-//			OnsiteTaskHisBlob onsiteTaskHisBlob = OnsiteTaskHisBlob.builder()
-//					.onsiteTaskId(req.getOnsiteTaskId())
-//					.hisContent(this.objectToByteArray(pmTaskRes))
-//					.build();
-//			onsiteTaskHisBlobService.save(onsiteTaskHisBlob);
-//		} catch (Exception e) {
-//			// TODO Auto-generated catch block
-//			e.printStackTrace();
-//		}
-
 		/* 更新巡检项目检查结果 */
 		List<EditItemResultReq> editItemResultList = req.getEditItemResultList();
     	for (EditItemResultReq editItemResult : editItemResultList) {
-    		onsiteItemResultService.remove(Wrappers.<OnsiteItemResult>lambdaQuery()
-                    .eq(OnsiteItemResult::getOnsiteTaskId, req.getOnsiteTaskId())
-                    .eq(OnsiteItemResult::getOnsiteItemId, editItemResult.getOnsiteItemId()));
-
     		OnsiteItemResult onsiteItemResult = OnsiteItemResult.builder()
-    				.onsiteTaskId(req.getOnsiteTaskId())
-    				.onsiteItemId(editItemResult.getOnsiteItemId())
+    				.id(editItemResult.getId())
     				.result(editItemResult.getResult())
     				.abnormal(editItemResult.getAbnormal())
     				.build();
-    		onsiteItemResultService.save(onsiteItemResult);
+    		onsiteItemResultService.updateById(onsiteItemResult);
     	}
 
 		return ResponseBeanBuilder.ok();
@@ -1291,6 +1321,23 @@ public class PreventMistakeServiceImpl extends ServiceImpl<PreventMistakeMapper,
 		List<AbnormalItemResultRes> abnormalItemResultList = preventMistakeMapper.getFaAbnormalItemResultList(searchReq);
 	    return abnormalItemResultList;
 	}
+	
+	
+	/**
+     * task二级审批不通过的,即为重检,此时将点检结果item_result为不通过的1都改成成-1,这样重检时相当于重新开始,没有之前首次点检的结果
+     *
+     * @param onsiteTaskId
+     * @return
+     */
+    @Override
+    public void setPmRepeatResult(long onsiteTaskId) {
+    	LambdaUpdateWrapper<OnsiteItemResult> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+        lambdaUpdateWrapper.eq(OnsiteItemResult::getOnsiteTaskId, onsiteTaskId)
+                .eq(OnsiteItemResult::getResult, 1)
+                .set(OnsiteItemResult::getResult, -1);
+        onsiteItemResultService.update(lambdaUpdateWrapper);
+    }
+    
 
 
     /**

+ 8 - 0
application-facade/src/main/java/com/factory/web/service/pm/PreventMistakeService.java

@@ -305,5 +305,13 @@ public interface PreventMistakeService extends IService<BentelerPlan> {
 	 * @return 异常列表
 	 */
 	public ResponseBean<List<AbnormalTaskInfoRes>> getAbnormalList(SearchAbnormalListReq req);
+	
+	/**
+     * task二级审批不通过的,即为重检,此时将点检结果item_result为不通过的1都改成成-1,这样重检时相当于重新开始,没有之前首次点检的结果
+     *
+     * @param onsiteTaskId
+     * @return
+     */
+    public void setPmRepeatResult(long onsiteTaskId);
 
 }

+ 3 - 0
application-facade/src/main/java/com/factory/wx/entity/req/AbnormalDetailReq.java

@@ -24,4 +24,7 @@ public class AbnormalDetailReq {
 
     @ApiModelProperty(value = "计划类型 1首件 2防错")
     private Long checkType;
+
+    @ApiModelProperty(value = "异常类型")
+    private Integer abnormalType;
 }

+ 34 - 0
application-facade/src/main/java/com/factory/wx/entity/req/SendMsgReq.java

@@ -0,0 +1,34 @@
+package com.factory.wx.entity.req;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author sMArT
+ * @version 1.0
+ * @date 2021-08-04 10:00 上午
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class SendMsgReq {
+
+    @ApiModelProperty(value = "接收用户id")
+    private Long toUserId;
+
+    @ApiModelProperty(value = "作业名称")
+    private String title;
+
+    @ApiModelProperty(value = "提醒内容")
+    private String content;
+
+    @ApiModelProperty(value = "截止日期")
+    private String endTime;
+
+    @ApiModelProperty(value = "发布人员id")
+    private Long fromUserId;
+}

+ 24 - 0
application-facade/src/main/java/com/factory/wx/mapper/AbnormalStatisticsMapper.java

@@ -1,10 +1,14 @@
 package com.factory.wx.mapper;
 
+import com.factory.web.entity.pm.req.SearchAbnormalReq;
+import com.factory.web.entity.pm.res.AbnormalItemRes;
 import com.factory.web.entity.pm.res.AbnormalTaskInfoRes;
 import com.factory.wx.entity.req.AbnormalPlanReq;
 import com.factory.wx.entity.res.AbnormalPlanRes;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -44,4 +48,24 @@ public interface AbnormalStatisticsMapper {
      * @return
      */
     List<AbnormalTaskInfoRes> getPmReleaseListByPlanId(Long planId);
+
+    /**
+     * 根据计划id获取首件重检
+     *
+     * @param planId
+     * @return
+     */
+    List<AbnormalTaskInfoRes> getFaRecheckedListByPlanId(Long planId);
+
+    /**
+     * 根据计划id获取防错重检
+     *
+     * @param planId
+     * @return
+     */
+    List<AbnormalTaskInfoRes> getPmRecheckedListByPlanId(Long planId);
+
+    List<AbnormalItemRes> getPmAbnormalItemResultList(@Param("req") SearchAbnormalReq searchReq);
+
+    List<AbnormalItemRes> getFaAbnormalItemResultList(@Param("req") SearchAbnormalReq searchReq);
 }

+ 9 - 0
application-facade/src/main/java/com/factory/wx/service/WxService.java

@@ -1,6 +1,7 @@
 package com.factory.wx.service;
 
 import com.factory.base.entity.aggregates.ResponseBean;
+import com.factory.wx.entity.req.SendMsgReq;
 import com.factory.wx.entity.res.FunctionsRes;
 
 import java.util.List;
@@ -25,9 +26,17 @@ public interface WxService {
 
     /**
      * 查询用户是否绑定
+     *
      * @param openid
      * @param userId
      * @return
      */
     Integer selectBindWeChatUserCount(String openid, Long userId);
+
+    /**
+     * 给微信用户发送消息
+     *
+     * @param sendMsgReq
+     */
+    void sendWechatMessage(SendMsgReq sendMsgReq);
 }

+ 59 - 40
application-facade/src/main/java/com/factory/wx/service/impl/AbnormalStatisticsServiceImpl.java

@@ -75,34 +75,17 @@ public class AbnormalStatisticsServiceImpl implements AbnormalStatisticsService
         abnormalPlanReq.setMonth(month);
 
         List<AbnormalPlanRes> releasedAbnormalPlans = new ArrayList<>();
-        //已放行
-        if (abnormalPlanReq.getAbnormalType() == 2) {
-            releasedAbnormalPlans.addAll(abnormalStatisticsMapper.getReleasedAbnormalPlans(abnormalPlanReq));
-        }
         //已重检
         if (abnormalPlanReq.getAbnormalType() == 1) {
             releasedAbnormalPlans.addAll(abnormalStatisticsMapper.getRecheckedAbnormalPlans(abnormalPlanReq));
         }
+        //已放行
+        if (abnormalPlanReq.getAbnormalType() == 2) {
+            releasedAbnormalPlans.addAll(abnormalStatisticsMapper.getReleasedAbnormalPlans(abnormalPlanReq));
+        }
         return releasedAbnormalPlans;
     }
 
-    /**
-     * 取得检查结果
-     *
-     * @param taskId
-     * @param itemId
-     * @param typeFlag 0表示首件 1表示200件 2表示中断
-     * @return 检查结果
-     */
-    private List<AbnormalItemResultRes> getAbnormalItemResultList(long taskId, long itemId, int typeFlag) {
-        SearchAbnormalReq searchReq = new SearchAbnormalReq();
-        searchReq.setTaskId(taskId);
-        searchReq.setItemId(itemId);
-        searchReq.setTypeFlag(typeFlag);
-        List<AbnormalItemResultRes> abnormalItemResultList = preventMistakeMapper.getFaAbnormalItemResultList(searchReq);
-        return abnormalItemResultList;
-    }
-
     /**
      * 异常放行详情
      *
@@ -116,14 +99,17 @@ public class AbnormalStatisticsServiceImpl implements AbnormalStatisticsService
         abnormalDetailRes.setPlanId(bentelerPlan.getId());
         abnormalDetailRes.setPlanName(bentelerPlan.getName());
 
-        //获取title
         if (abnormalDetailReq.getCheckType() == 1) {
+            //获取title
             FirstArticleTitle title = firstArticleService.getFaTitle(abnormalDetailReq.getPlanId());
             //判断是否有附件
             int attrCount = fileMapper.selectCount(Wrappers.<FileEntry>lambdaQuery()
                     .eq(FileEntry::getId, title.getUploadAttachmentId()));
             abnormalDetailRes.setFirstArticleTitle(title);
             abnormalDetailRes.setAttachment(attrCount == 0 ? 0 : 1);
+            //取放行信息
+            List<AbnormalTaskInfoRes> abnormalTaskInfoResList = getFaAbnormalTaskInfoRes(abnormalDetailReq);
+            abnormalDetailRes.setAbnormalTaskInfos(abnormalTaskInfoResList);
         }
         if (abnormalDetailReq.getCheckType() == 2) {
             //获取title
@@ -133,15 +119,8 @@ public class AbnormalStatisticsServiceImpl implements AbnormalStatisticsService
                     .eq(FileEntry::getId, title.getUploadAttachmentId()));
             abnormalDetailRes.setTitleInfo(title);
             abnormalDetailRes.setAttachment(attrCount == 0 ? 0 : 1);
-        }
-
-        //取放行信息
-        if (abnormalDetailReq.getCheckType() == 1) {
-            List<AbnormalTaskInfoRes> abnormalTaskInfoResList = getFaAbnormalTaskInfoRes(abnormalDetailReq.getPlanId());
-            abnormalDetailRes.setAbnormalTaskInfos(abnormalTaskInfoResList);
-        }
-        if (abnormalDetailReq.getCheckType() == 2) {
-            List<AbnormalTaskInfoRes> abnormalTaskInfoResList = getPMAbnormalTaskInfoRes(abnormalDetailReq.getPlanId());
+            //取放行信息
+            List<AbnormalTaskInfoRes> abnormalTaskInfoResList = getPMAbnormalTaskInfoRes(abnormalDetailReq);
             abnormalDetailRes.setAbnormalTaskInfos(abnormalTaskInfoResList);
         }
 
@@ -151,11 +130,19 @@ public class AbnormalStatisticsServiceImpl implements AbnormalStatisticsService
     /**
      * 获取首件放行信息
      *
-     * @param planId
+     * @param abnormalDetailReq
      * @return
      */
-    private List<AbnormalTaskInfoRes> getFaAbnormalTaskInfoRes(Long planId) {
-        List<AbnormalTaskInfoRes> faList = abnormalStatisticsMapper.getFaReleaseListByPlanId(planId);
+    private List<AbnormalTaskInfoRes> getFaAbnormalTaskInfoRes(AbnormalDetailReq abnormalDetailReq) {
+        List<AbnormalTaskInfoRes> faList = new ArrayList<>();
+        if (abnormalDetailReq.getAbnormalType() == 1) {
+            //重检内容
+            faList = abnormalStatisticsMapper.getFaRecheckedListByPlanId(abnormalDetailReq.getPlanId());
+        }
+        if (abnormalDetailReq.getAbnormalType() == 2) {
+            //放行内容
+            faList = abnormalStatisticsMapper.getFaReleaseListByPlanId(abnormalDetailReq.getPlanId());
+        }
 
         for (AbnormalTaskInfoRes faInfo : faList) {
             List<FirstArticleWorkshop> firstArticleWorkshopList = firstArticleWorkshopService.list(Wrappers.<FirstArticleWorkshop>lambdaQuery()
@@ -174,9 +161,15 @@ public class AbnormalStatisticsServiceImpl implements AbnormalStatisticsService
 
                 SearchAbnormalReq searchReq = new SearchAbnormalReq();
                 searchReq.setWorkshopId(abnormalWorkshopList.get(i).getWorkshopId());
-                List<AbnormalItemRes> abnormalItemList = preventMistakeMapper.getFaAbnormalItemList(searchReq);
+                List<AbnormalItemRes> abnormalItemList = abnormalStatisticsMapper.getFaAbnormalItemResultList(searchReq);
 
                 for (AbnormalItemRes abnormalItemInfo : abnormalItemList) {
+
+                    Long userId = abnormalItemInfo.getItemResultUserId();
+                    if (null != userId) {
+                        String userName = wxPlanService.getUserNameById(abnormalItemInfo.getItemResultUserId());
+                        abnormalItemInfo.setItemResultUser(userName);
+                    }
                     List<AbnormalItemResultRes> firstItemResultList = this.getAbnormalItemResultList(faInfo.getTaskId(), abnormalItemInfo.getItemId(), 0);
                     abnormalItemInfo.setFirstItemResultList(firstItemResultList);
 
@@ -188,7 +181,7 @@ public class AbnormalStatisticsServiceImpl implements AbnormalStatisticsService
                 }
 
                 abnormalWorkshopList.get(i).setAbnormalItemList(abnormalItemList);
-                faInfo.setAbnormalWorkshopList(abnormalWorkshopList);
+                faInfo.setAbnormalWorkshopList(abnormalWorkshopList.stream().filter(workshop -> null != workshop.getAbnormalItemList() && workshop.getAbnormalItemList().size() > 0).collect(Collectors.toList()));
             }
         }
         return faList;
@@ -197,11 +190,20 @@ public class AbnormalStatisticsServiceImpl implements AbnormalStatisticsService
     /**
      * 获取防错放行信息
      *
-     * @param planId
+     * @param abnormalDetailReq
      * @return
      */
-    private List<AbnormalTaskInfoRes> getPMAbnormalTaskInfoRes(Long planId) {
-        List<AbnormalTaskInfoRes> pmList = abnormalStatisticsMapper.getPmReleaseListByPlanId(planId);
+    private List<AbnormalTaskInfoRes> getPMAbnormalTaskInfoRes(AbnormalDetailReq abnormalDetailReq) {
+        List<AbnormalTaskInfoRes> pmList = new ArrayList<>();
+        if (abnormalDetailReq.getAbnormalType() == 1) {
+            //重检内容
+            pmList = abnormalStatisticsMapper.getPmRecheckedListByPlanId(abnormalDetailReq.getPlanId());
+        }
+        if (abnormalDetailReq.getAbnormalType() == 2) {
+            //放行内容
+            pmList = abnormalStatisticsMapper.getPmReleaseListByPlanId(abnormalDetailReq.getPlanId());
+        }
+
         for (AbnormalTaskInfoRes pmInfo : pmList) {
             List<OnsiteWorkshop> onsiteWorkshopList = onsiteWorkshopService.list(Wrappers.<OnsiteWorkshop>lambdaQuery()
                     .eq(OnsiteWorkshop::getBentelerPlanId, pmInfo.getBentelerPlanId()));
@@ -219,7 +221,7 @@ public class AbnormalStatisticsServiceImpl implements AbnormalStatisticsService
                 SearchAbnormalReq searchReq = new SearchAbnormalReq();
                 searchReq.setWorkshopId(abnormalWorkshopList.get(i).getWorkshopId());
                 searchReq.setTaskId(pmInfo.getTaskId());
-                List<AbnormalItemRes> abnormalItemList = preventMistakeMapper.getPmAbnormalItemList(searchReq).stream().filter(abnormalItemRes -> abnormalItemRes.getResult() > 0).collect(Collectors.toList());
+                List<AbnormalItemRes> abnormalItemList = abnormalStatisticsMapper.getPmAbnormalItemResultList(searchReq).stream().filter(abnormalItemRes -> abnormalItemRes.getResult() > 0).collect(Collectors.toList());
                 for (AbnormalItemRes abnormalItemRes : abnormalItemList) {
                     Long userId = abnormalItemRes.getItemResultUserId();
                     if (null != userId) {
@@ -235,6 +237,23 @@ public class AbnormalStatisticsServiceImpl implements AbnormalStatisticsService
         return pmList;
     }
 
+    /**
+     * 取得检查结果
+     *
+     * @param taskId
+     * @param itemId
+     * @param typeFlag 0表示首件 1表示200件 2表示中断
+     * @return 检查结果
+     */
+    private List<AbnormalItemResultRes> getAbnormalItemResultList(long taskId, long itemId, int typeFlag) {
+        SearchAbnormalReq searchReq = new SearchAbnormalReq();
+        searchReq.setTaskId(taskId);
+        searchReq.setItemId(itemId);
+        searchReq.setTypeFlag(typeFlag);
+        List<AbnormalItemResultRes> abnormalItemResultList = preventMistakeMapper.getFaAbnormalItemResultList(searchReq);
+        return abnormalItemResultList;
+    }
+
     /**
      * 验证日期格式
      *

+ 21 - 1
application-facade/src/main/java/com/factory/wx/service/impl/PlanPassFAServiceImpl.java

@@ -18,14 +18,18 @@ import com.factory.web.service.pm.PreventMistakeService;
 import com.factory.wx.entity.req.PlanApprovalTaskReq;
 import com.factory.wx.entity.req.PlanPassReq;
 import com.factory.wx.entity.req.SearchPlanPassReq;
+import com.factory.wx.entity.req.SendMsgReq;
 import com.factory.wx.entity.res.*;
 import com.factory.wx.mapper.PlanPassMapper;
 import com.factory.wx.service.PlanPassFAService;
 import com.factory.wx.service.WxPlanService;
+import com.factory.wx.service.WxService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -57,6 +61,8 @@ public class PlanPassFAServiceImpl implements PlanPassFAService {
     private ApprovalRuleMapper approvalRuleMapper;
     @Autowired
     private PreventMistakeService preventMistakeService;
+    @Autowired
+    private WxService wxService;
 
     /**
      * 计划放行详情-首件
@@ -216,7 +222,6 @@ public class PlanPassFAServiceImpl implements PlanPassFAService {
         if (planApprovalTaskReq.getStatus() == 1) {
             //审批通过,更新task状态
             updateFirstArticleTask(planApprovalTaskReq);
-            firstArticleService.setFirstArticleTaskHis(planApprovalTaskReq.getTaskId());
         }
     }
 
@@ -243,9 +248,24 @@ public class PlanPassFAServiceImpl implements PlanPassFAService {
                     .approvalUserId(approvalUserRes.getUserId())
                     .status(0)
                     .build());
+
+            //向下一级别发送提醒
+            Date date = new Date();
+            SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
+            //发送微信消息
+            wxService.sendWechatMessage(SendMsgReq.builder()
+                    .toUserId(approvalUserRes.getUserId())
+                    .title("计划放行提醒")
+                    .content("您有待放行的计划审批,请登录小程序查看【计划放行】")
+                    .endTime(ft.format(date))
+                    .fromUserId(planApprovalTaskReq.getUserId())
+                    .build());
         } else {
             //如果是最后一个审批级别则设置task状态为不通过
             updateFirstArticleTask(planApprovalTaskReq);
+            //最有一级记录task日志,为不通过
+            firstArticleService.setFirstArticleTaskHis(planApprovalTaskReq.getTaskId());
+            firstArticleService.setFaRepeatResult(planApprovalTaskReq.getTaskId());
         }
     }
 

+ 24 - 6
application-facade/src/main/java/com/factory/wx/service/impl/PlanPassPMServiceImpl.java

@@ -13,14 +13,18 @@ import com.factory.web.service.pm.PreventMistakeService;
 import com.factory.wx.entity.req.PlanApprovalTaskReq;
 import com.factory.wx.entity.req.PlanPassReq;
 import com.factory.wx.entity.req.SearchPlanPassReq;
+import com.factory.wx.entity.req.SendMsgReq;
 import com.factory.wx.entity.res.*;
 import com.factory.wx.mapper.PlanPassMapper;
 import com.factory.wx.service.PlanPassPMService;
 import com.factory.wx.service.WxPlanService;
+import com.factory.wx.service.WxService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -50,6 +54,8 @@ public class PlanPassPMServiceImpl implements PlanPassPMService {
     private ApprovalRuleMapper approvalRuleMapper;
     @Autowired
     private PreventMistakeService preventMistakeService;
+    @Autowired
+    private WxService wxService;
 
     /**
      * 计划放行详情-防错
@@ -191,17 +197,16 @@ public class PlanPassPMServiceImpl implements PlanPassPMService {
      * @return boolean 是否有下一级别
      */
     private void settingApprovalTask(PlanApprovalTaskReq planApprovalTaskReq) {
+        //审批通过
+        if (planApprovalTaskReq.getStatus() == 1) {
+            //审批通过,更新task状态
+            updateOnsiteTask(planApprovalTaskReq);
+        }
         //审批不通过触发下一级别
         if (planApprovalTaskReq.getStatus() == 2) {
             //设置防错下一级别审批
             setNextPMApprovalLevel(planApprovalTaskReq);
         }
-        //审批通过,保存审批历史
-        if (planApprovalTaskReq.getStatus() == 1) {
-            //审批通过,更新task状态
-            updateOnsiteTask(planApprovalTaskReq);
-            preventMistakeService.setOnsiteTaskHis(planApprovalTaskReq.getTaskId());
-        }
     }
 
     /**
@@ -228,9 +233,22 @@ public class PlanPassPMServiceImpl implements PlanPassPMService {
                     .approvalUserId(approvalUserRes.getUserId())
                     .status(0)
                     .build());
+            //向下一级别发送提醒
+            Date date = new Date();
+            SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
+            wxService.sendWechatMessage(SendMsgReq.builder()
+                    .toUserId(approvalUserRes.getUserId())
+                    .title("计划放行提醒")
+                    .content("您有待放行的计划审批,请登录小程序查看【计划放行】")
+                    .endTime(ft.format(date))
+                    .fromUserId(planApprovalTaskReq.getUserId())
+                    .build());
         } else {
             //如果是最后一个审批级别则设置task状态为不通过
             updateOnsiteTask(planApprovalTaskReq);
+            //最有一级记录task日志,为不通过
+            preventMistakeService.setOnsiteTaskHis(planApprovalTaskReq.getTaskId());
+            preventMistakeService.setPmRepeatResult(planApprovalTaskReq.getTaskId());
         }
     }
 

+ 56 - 0
application-facade/src/main/java/com/factory/wx/service/impl/WxServiceImpl.java

@@ -3,14 +3,24 @@ package com.factory.wx.service.impl;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.factory.base.entity.aggregates.ResponseBean;
 import com.factory.base.util.res.ResponseBeanBuilder;
+import com.factory.util.client.AppEntry;
+import com.factory.util.client.PushWxMessage;
+import com.factory.util.client.TemplateEntry;
+import com.factory.util.client.ValEntry;
 import com.factory.wx.entity.UsUserWechat;
+import com.factory.wx.entity.req.SendMsgReq;
 import com.factory.wx.entity.res.FunctionsRes;
 import com.factory.wx.mapper.WxMapper;
+import com.factory.wx.service.WxPlanService;
 import com.factory.wx.service.WxService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.HashMap;
 import java.util.List;
 
 /**
@@ -22,8 +32,27 @@ import java.util.List;
 @Transactional(rollbackFor = Exception.class)
 public class WxServiceImpl implements WxService {
 
+    private final static Logger LOGGER = LoggerFactory.getLogger(WxServiceImpl.class);
+
+    @Value("${wx.minprogram.appsecret}")
+    private String appsecret;
+
+    @Value("${wx.minprogram.appid}")
+    private String appid;
+
+    @Value("${wx.minprogram.templateId}")
+    private String templateId;
+
+    @Value("${wx.minprogram.page}")
+    private String page;
+
+    @Value("${wx.minprogram.miniprogramState}")
+    private String miniprogramState;
+
     @Autowired
     private WxMapper wxMapper;
+    @Autowired
+    private WxPlanService wxPlanService;
 
     @Override
     public ResponseBean<List<FunctionsRes>> getUserFunction(Long userId) {
@@ -63,4 +92,31 @@ public class WxServiceImpl implements WxService {
     public Integer selectBindWeChatUserCount(String openid, Long userId) {
         return wxMapper.selectCount(Wrappers.<UsUserWechat>lambdaQuery().eq(UsUserWechat::getUserId, userId).eq(UsUserWechat::getOpenid, openid));
     }
+
+    @Override
+    public void sendWechatMessage(SendMsgReq sendMsgReq) {
+        try {
+            String openId = wxMapper.selectOne(Wrappers.<UsUserWechat>lambdaQuery().eq(UsUserWechat::getUserId, sendMsgReq.getToUserId())).getOpenid();
+            if (!openId.isEmpty()) {
+                AppEntry appEntry = AppEntry.builder().appId(appid).secret(appsecret).build();
+                HashMap<String, ValEntry> dataMap = new HashMap();
+                dataMap.put("thing1", ValEntry.builder().value(sendMsgReq.getContent()).build());
+                dataMap.put("thing2", ValEntry.builder().value(sendMsgReq.getTitle()).build());
+                dataMap.put("time3", ValEntry.builder().value(sendMsgReq.getEndTime()).build());
+                String fromUserName = wxPlanService.getUserNameById(sendMsgReq.getFromUserId());
+                dataMap.put("thing4", ValEntry.builder().value(fromUserName).build());
+                TemplateEntry tpl = TemplateEntry.builder()
+                        .template_id(templateId)
+                        .touser(openId)
+                        .page(page)
+                        .miniprogram_state(miniprogramState)
+                        .data(dataMap)
+                        .build();
+                PushWxMessage.sendMessage(appEntry, tpl);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            LOGGER.error("下发微信消息异常");
+        }
+    }
 }

+ 3 - 0
application-facade/src/main/resources/application-dev.yml

@@ -100,3 +100,6 @@ jetcache:
         maxTotal: 50
       host: ${SPRING.REDIS.HOST:192.168.31.14}
       port: ${SPRING.REDIS.PORT:6379}
+wx:
+  minprogram:
+    miniprogramState: trial

+ 3 - 0
application-facade/src/main/resources/application-test.yml

@@ -121,3 +121,6 @@ jetcache:
       host: ${SPRING.REDIS.HOST:39.100.230.190}
       port: ${SPRING.REDIS.PORT:8120}
       password: ${SPRING.REDIS.PASSWORD:jh1q2w3e4r}
+wx:
+  minprogram:
+    miniprogramState: trial

+ 3 - 0
application-facade/src/main/resources/application.yml

@@ -78,6 +78,9 @@ wx:
   minprogram:
     appid: wxfd6e42e05b91163c
     appsecret: 7c4e39a33bf8b66beb919b9ad0a15832
+    templateId: 3RatcsOA-T0Dsgevr-1UGvYzZvhS0UY9A86fnTFax50
+    page: pages/login/index
+    miniprogramState: formal
 download:
    excel:
       imgid: 23

+ 173 - 30
application-facade/src/main/resources/mapper/AbnormalStatisticsMapper.xml

@@ -8,75 +8,101 @@
         SELECT DISTINCT
             bp.id AS plan_id,
             bp.`name` AS plan_name,
-            bp.plan_type
+            bp.plan_type,
+            2 AS abnormal_type
         FROM
             onsite_task ot,
             onsite_calendar oc,
+            onsite_approval_task oat,
             benteler_plan bp
         WHERE
             ot.onsite_calendar_id = oc.id
             AND oc.benteler_plan_id = bp.id
+            AND ot.id = oat.onsite_task_id
             AND ot.`status` = 2
-            <if test="name != ''">
+            AND oat.`status` = 1
+        <if test="name != ''">
                 AND bp.`name` LIKE CONCAT('%',#{name},'%')
-            </if>
-            AND ot.task_time LIKE CONCAT(#{month},'%')
+        </if>
+        AND ot.task_time LIKE CONCAT(#{month},'%')
         UNION
         SELECT DISTINCT
             bp.id AS plan_id,
             bp.`name` AS plan_name,
-            bp.plan_type
+            bp.plan_type,
+            2 AS abnormal_type
         FROM
             first_article_task ot,
             first_article_calendar oc,
+            first_article_approval_task oat,
             benteler_plan bp
         WHERE
             ot.first_article_calendar_id = oc.id
             AND oc.benteler_plan_id = bp.id
+            AND ot.id = oat.first_article_task_id
             AND ot.`status` = 2
-            <if test="name != ''">
-                AND bp.`name` LIKE CONCAT('%',#{name},'%')
-            </if>
-            AND ot.task_time LIKE CONCAT(#{month},'%');
+            AND oat.`status` = 1
+        <if test="name != ''">
+            AND bp.`name` LIKE CONCAT('%',#{name},'%')
+        </if>
+        AND ot.task_time LIKE CONCAT(#{month},'%');
     </select>
     <!-- 获取重检异常计划列表 -->
     <select id="getRecheckedAbnormalPlans" parameterType="com.factory.wx.entity.req.AbnormalPlanReq"
             resultType="com.factory.wx.entity.res.AbnormalPlanRes">
         SELECT DISTINCT
-            bp.id AS plan_id,
+            oc.benteler_plan_id AS plan_id,
             bp.`name` AS plan_name,
-            bp.plan_type
+            bp.plan_type,
+            1 AS abnormal_type
         FROM
-            onsite_task_his_blob othb,
             onsite_task ot,
             onsite_calendar oc,
-            benteler_plan bp
+            benteler_plan bp,
+            (
+                SELECT DISTINCT
+                    othb.onsite_task_id
+                FROM
+                    onsite_task_his_blob othb,
+                    onsite_task ot
+                WHERE
+                    othb.onsite_task_id = ot.id
+            ) r
         WHERE
-            othb.onsite_task_id = ot.id
-          AND ot.onsite_calendar_id = oc.id
-          AND oc.benteler_plan_id = bp.id
-        <if test="name != ''">
-            AND bp.`name` LIKE CONCAT('%',#{name},'%')
-        </if>
-        AND ot.task_time LIKE CONCAT(#{month},'%')
+            ot.id = r.onsite_task_id
+            AND ot.onsite_calendar_id = oc.id
+            AND oc.benteler_plan_id = bp.id
+            <if test="name != ''">
+                AND bp.`name` LIKE CONCAT('%',#{name},'%')
+            </if>
+            AND ot.task_time LIKE CONCAT(#{month},'%')
         UNION
         SELECT DISTINCT
-            bp.id AS plan_id,
+            fac.benteler_plan_id AS plan_id,
             bp.`name` AS plan_name,
-            bp.plan_type
+            bp.plan_type,
+            1 AS abnormal_type
         FROM
-            first_article_task_his_blob othb,
-            first_article_task ot,
-            first_article_calendar oc,
-            benteler_plan bp
+            first_article_task fat,
+            first_article_calendar fac,
+            benteler_plan bp,
+            (
+                SELECT DISTINCT
+                    fathb.first_article_task_id
+                FROM
+                    first_article_task_his_blob fathb,
+                    first_article_task fat
+                WHERE
+                    fathb.first_article_task_id = fat.id
+            ) r
         WHERE
-            othb.first_article_task_id = ot.id
-          AND ot.first_article_calendar_id = oc.id
-          AND oc.benteler_plan_id = bp.id
+            fat.id = r.first_article_task_id
+            AND fat.first_article_calendar_id = fac.id
+            AND fac.benteler_plan_id = bp.id
         <if test="name != ''">
             AND bp.`name` LIKE CONCAT('%',#{name},'%')
         </if>
-        AND ot.task_time LIKE CONCAT(#{month},'%');
+        AND fat.task_time LIKE CONCAT(#{month},'%');
     </select>
 
     <!-- 取得防错放行 -->
@@ -131,5 +157,122 @@
           AND     fat.`status` = 2
           AND     bp.id = #{planId}
     </select>
+    <!-- 防错重检信息 -->
+    <select id="getPmRecheckedListByPlanId" resultType="com.factory.web.entity.pm.res.AbnormalTaskInfoRes">
+        SELECT
+            oc.benteler_plan_id,
+            bp.`name` AS benteler_plan_name,
+            bp.plan_type,
+            uu.username AS person,
+            2 AS method,
+            oat.reason,
+            oat.updated_time,
+            ot.`status`,
+            oc.type_flag,
+            ot.id AS task_id
+        FROM
+            onsite_task ot,
+            onsite_approval_task oat,
+            onsite_calendar oc,
+            benteler_plan bp,
+            us_user uu,
+            (
+                SELECT DISTINCT
+                    othb.onsite_task_id
+                FROM
+                    onsite_task_his_blob othb,
+                    onsite_task ot
+                WHERE
+                    othb.onsite_task_id = ot.id
+            ) r
+        WHERE
+            ot.id = r.onsite_task_id
+          AND oat.onsite_task_id = r.onsite_task_id
+          AND ot.onsite_calendar_id = oc.id
+          AND oc.benteler_plan_id = bp.id
+          AND oc.user_id = uu.id
+          AND   bp.id = #{planId}
+    </select>
+    <!-- 首件重检信息 -->
+    <select id="getFaRecheckedListByPlanId" resultType="com.factory.web.entity.pm.res.AbnormalTaskInfoRes">
+        SELECT
+            fac.benteler_plan_id,
+            bp.`name` AS benteler_plan_name,
+            bp.plan_type,
+            uu.username AS person,
+            2 AS method,
+            faat.reason,
+            faat.updated_time,
+            fat.`status`,
+            fac.type_flag,
+            fat.id AS task_id
+        FROM
+            first_article_task fat,
+            first_article_approval_task faat,
+            first_article_calendar fac,
+            benteler_plan bp,
+            us_user uu,
+            (
+                SELECT DISTINCT
+                    fathb.first_article_task_id
+                FROM
+                    first_article_task_his_blob fathb,
+                    first_article_task fat
+                WHERE
+                    fathb.first_article_task_id = fat.id
+            ) r
+        WHERE
+            fat.id = r.first_article_task_id
+          AND faat.first_article_task_id = r.first_article_task_id
+          AND fat.first_article_calendar_id = fac.id
+          AND fac.benteler_plan_id = bp.id
+          AND fac.user_id = uu.id
+          AND   bp.id = #{planId}
+    </select>
 
+    <!-- 取得防错工作站下的巡检项目和检查结果 -->
+    <select id="getPmAbnormalItemResultList" resultType="com.factory.web.entity.pm.res.AbnormalItemRes">
+        SELECT  oir.onsite_item_id AS item_id,
+                oi.item_content,
+                oir.result,
+                oir.abnormal,
+                oir.created_time AS item_result_create_time,
+                oir.created_user_id AS item_result_user_id
+        FROM    onsite_item_result oir,
+                onsite_item oi
+        WHERE   oir.onsite_item_id = oi.id
+          AND     oir.onsite_task_id = #{req.taskId}
+          AND     oi.workshop_id = #{req.workshopId}
+    </select>
+    <!-- 取得首件工作站下的巡检项目 -->
+    <select id="getFaAbnormalItemResultList" resultType="com.factory.web.entity.pm.res.AbnormalItemRes">
+        SELECT
+            fai.id AS item_id,
+            fai.item_content,
+            fai.item_standard,
+            fai.prefix,
+            fai.sno_start,
+            fai.sno_end,
+            fai.val_flag,
+            fai.val_up,
+            fai.val_down,
+            fai.val_ok,
+            fai.val_desc,
+            fai.level_info,
+            fai.product_info,
+            fai.tool_id,
+            fai.tool_desc,
+            fai.first_flag,
+            fai.two_hundred_flag,
+            fai.catch_flag,
+            fai.val_unit,
+            fair.created_time AS item_result_create_time,
+            fair.created_user_id AS item_result_user_id
+        FROM
+            first_article_item fai,
+            first_article_item_result fair
+        WHERE
+            fai.workshop_id = #{req.workshopId}
+        AND fai.id = fair.first_article_item_id
+    </select>
 </mapper>

+ 14 - 2
application-facade/src/main/resources/mapper/FirstArticleMapper.xml

@@ -167,7 +167,7 @@
 				first_article_workshop faw
 		WHERE   fair.first_article_item_id = fai.id
 		AND     fai.workshop_id = faw.id
-		AND     fair.result = 1
+		AND     fair.result_bak = 1
 		AND     faw.benteler_plan_id = #{req.bentelerPlanId}
 		AND     fair.first_article_task_id = #{req.firstArticleTaskId}
     </select>
@@ -212,7 +212,7 @@
 			fair.first_article_task_id = fat.id 
 			AND fair.first_article_item_id = fai.id 
 			AND fat.`status` = 3 
-			AND fair.result = 1 
+			AND fair.result_bak = 1 
 			AND fai.workshop_id = #{req.workshopId}
 			AND fair.first_article_task_id = #{req.firstArticleTaskId}
     </select>
@@ -470,4 +470,16 @@
 
     </select>
     
+    <!-- 取得重检项目下(result_bak = 1),未完成重检(result = -1)的item_result数量,如果重检了result会变成0或1 -->
+	<select id="getFaRepeatItemResultCount" resultType="int">
+	    SELECT  COUNT(fair.id)
+		FROM    first_article_item_result fair,
+				first_article_item fai
+		WHERE   fair.first_article_item_id = fai.id
+		AND     fair.result_bak = 1
+		AND     fair.result = -1
+		AND     fai.workshop_id = #{req.workshopId}
+		AND     fair.first_article_task_id = #{req.firstArticleTaskId}
+	</select>
+    
 </mapper>

+ 23 - 4
application-facade/src/main/resources/mapper/PreventMistakeMapper.xml

@@ -171,7 +171,7 @@
 
     <!--取得Pad端防错计划列表 -->
     <select id="getPmPlanListForPad" resultType="com.factory.web.entity.pm.res.PmPlanListForPadRes">
-        SELECT ot.id AS onsite_task_id,
+        SELECT DISTINCT ot.id AS onsite_task_id,
 		       ot.`status`,
 			   oc.benteler_plan_id,
 			   bp.`name` AS benteler_plan_name,
@@ -179,9 +179,14 @@
 			   oc.type_flag
 		FROM   onsite_task ot,
 		       onsite_calendar oc,
-			   benteler_plan bp
+			   benteler_plan bp,
+			   onsite_workshop ow,
+			   onsite_item oi
 		WHERE  ot.onsite_calendar_id = oc.id
 		AND    oc.benteler_plan_id = bp.id
+		AND    ow.benteler_plan_id = bp.id
+	    AND    oi.workshop_id = ow.id
+	    AND    oi.type_flag = oc.type_flag
 		AND    bp.pause_flag = 0
 		<if test="req.type == 0"> <!-- 未完成 -->
 		AND    ot.`status` = 0
@@ -243,7 +248,7 @@
 				onsite_workshop ow
 		WHERE   oir.onsite_item_id = oi.id
 		AND     oi.workshop_id = ow.id
-		AND     oir.result = 1
+		AND     oir.result_bak = 1
 		AND     ow.benteler_plan_id = #{req.bentelerPlanId}
 		AND     oir.onsite_task_id = #{req.onsiteTaskId}
 		AND     oi.type_flag = #{req.typeFlag}
@@ -252,6 +257,7 @@
     <!-- 取得不放行任务对应的点检项目 -->
     <select id="getPmItemNoGoList" resultType="com.factory.web.entity.pm.res.PmItemNoGoListRes">
         SELECT
+            oir.id,
 			oir.onsite_item_id,
 			oi.item_content,
 			oir.result,
@@ -264,7 +270,7 @@
 			oir.onsite_task_id = ot.id
 			AND oir.onsite_item_id = oi.id
 			AND ot.`status` = 3
-			AND oir.result = 1
+			AND oir.result_bak = 1
 			AND oi.workshop_id = #{req.workshopId}
 			AND oir.onsite_task_id = #{req.onsiteTaskId}
 			AND oi.type_flag = #{req.typeFlag}
@@ -570,5 +576,18 @@
 		AND     ow.benteler_plan_id = #{req.bentelerPlanId}
 		AND     oi.type_flag = #{req.typeFlag}
     </select>
+    
+    <!-- 取得重检项目下(result_bak = 1),未完成重检(result = -1)的item_result数量,如果重检了result会变成0或1 -->
+	<select id="getPmRepeatItemResultCount" resultType="int">
+	    SELECT  COUNT(oir.id)
+		FROM    onsite_item_result oir,
+				onsite_item oi
+		WHERE   oir.onsite_item_id = oi.id
+		AND     oir.result_bak = 1
+		AND     oir.result = -1
+		AND     oi.workshop_id = #{req.workshopId}
+		AND     oir.onsite_task_id = #{req.onsiteTaskId}
+		AND     oi.type_flag = #{req.typeFlag}
+	</select>
 
 </mapper>

+ 33 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/common/HttpCilentUntil.java

@@ -4,11 +4,14 @@ import org.apache.http.HttpEntity;
 import org.apache.http.client.config.RequestConfig;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
 
 import java.net.URLEncoder;
+import java.nio.charset.Charset;
 import java.util.Map;
 
 public class HttpCilentUntil {
@@ -56,4 +59,34 @@ public class HttpCilentUntil {
         return result;
     }
 
+    /**
+     * 提交一个json信息
+     * @param url
+     * @param jsonParam
+     * @return
+     */
+    public static String httpJsonToString(String url, String jsonParam) {
+        String result = null;
+        CloseableHttpClient client=null;
+        try {
+            client = HttpClients.createDefault();
+            RequestConfig requestConfig = RequestConfig.custom()
+                    .setConnectTimeout(5000).setConnectionRequestTimeout(1000)
+                    .setSocketTimeout(5000).build();
+            HttpPost hp = new HttpPost( url);
+
+            hp.addHeader("Content-type","application/json; charset=utf-8");
+            hp.setHeader("Accept", "application/json");
+            hp.setEntity(new StringEntity(jsonParam, Charset.forName("UTF-8")));
+            hp.setConfig(requestConfig);
+            CloseableHttpResponse response=client.execute(hp);
+            HttpEntity entity = response.getEntity();
+            result = EntityUtils.toString(entity, "utf-8");
+        } catch (Throwable e) {
+            e.printStackTrace();
+            return null;
+        }
+        return result;
+    }
+
 }

+ 73 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/entry/SendMsgReq.java

@@ -0,0 +1,73 @@
+package com.jihengbel.intelligent.applicationtask.entry;
+
+/**
+ * @author sMArT
+ * @version 1.0
+ * @date 2021-08-04 10:00 上午
+ */
+public class SendMsgReq {
+
+    /**
+     * 接收用户id
+     */
+    private Long toUserId;
+    /**
+     * 作业名称
+     */
+    private String title;
+
+    /**
+     * 提醒内容
+     */
+    private String content;
+
+    /**
+     * 截止日期
+     */
+    private String endTime;
+
+    /**
+     * 发布人员id
+     */
+    private Long fromUserId;
+
+    public Long getToUserId() {
+        return toUserId;
+    }
+
+    public void setToUserId(Long toUserId) {
+        this.toUserId = toUserId;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public Long getFromUserId() {
+        return fromUserId;
+    }
+
+    public void setFromUserId(Long fromUserId) {
+        this.fromUserId = fromUserId;
+    }
+}

+ 78 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/entry/TemplateEntry.java

@@ -0,0 +1,78 @@
+package com.jihengbel.intelligent.applicationtask.entry;
+
+import java.util.HashMap;
+
+public class TemplateEntry {
+    /**
+     * 模板id
+     */
+    private String template_id;
+    /**
+     * 跳转小程序页面
+     */
+    private String page;
+    /**
+     * 跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
+     */
+    private String miniprogram_state;
+    /**
+     * 语言类型
+     */
+    private String lang;//不是必填
+    /**
+     * 接收者openid
+     */
+    private String touser;
+    /**
+     * 模板内容
+     */
+    private HashMap<String, String> data;
+
+    public String getTemplate_id() {
+        return template_id;
+    }
+
+    public void setTemplate_id(String template_id) {
+        this.template_id = template_id;
+    }
+
+    public String getPage() {
+        return page;
+    }
+
+    public void setPage(String page) {
+        this.page = page;
+    }
+
+    public String getMiniprogram_state() {
+        return miniprogram_state;
+    }
+
+    public void setMiniprogram_state(String miniprogram_state) {
+        this.miniprogram_state = miniprogram_state;
+    }
+
+    public String getLang() {
+        return lang;
+    }
+
+    public void setLang(String lang) {
+        this.lang = lang;
+    }
+
+    public String getTouser() {
+        return touser;
+    }
+
+    public void setTouser(String touser) {
+        this.touser = touser;
+    }
+
+    public HashMap<String, String> getData() {
+        return data;
+    }
+
+    public void setData(HashMap<String, String> data) {
+        this.data = data;
+    }
+}

+ 13 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/init/FirstRemindJob.java

@@ -3,7 +3,9 @@ package com.jihengbel.intelligent.applicationtask.init;
 import com.jihengbel.intelligent.applicationtask.common.CommonUtil;
 import com.jihengbel.intelligent.applicationtask.entry.FirstCalendar;
 import com.jihengbel.intelligent.applicationtask.entry.OnsiteCalendar;
+import com.jihengbel.intelligent.applicationtask.entry.SendMsgReq;
 import com.jihengbel.intelligent.applicationtask.service.FirstTaskService;
+import com.jihengbel.intelligent.applicationtask.service.MsgService;
 import com.jihengbel.intelligent.applicationtask.service.OnsiteTaskService;
 import com.jihengbel.intelligent.applicationtask.websocket.WsSessionManager;
 import org.quartz.DisallowConcurrentExecution;
@@ -12,6 +14,7 @@ import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 import org.springframework.web.socket.TextMessage;
 
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentMap;
@@ -181,6 +184,7 @@ public class FirstRemindJob implements Job {
         @Override
         public Integer call() throws Exception {
             FirstTaskService firstTaskService = (FirstTaskService) paramMap.get("firstTaskService");
+            MsgService msgService = (MsgService) paramMap.get("msgService");
             List<FirstCalendar> cals = firstTaskService.getRemindWork(paramQuery);
             String day = null;
             String format = "yyyy-MM-dd HH:mm";
@@ -211,6 +215,15 @@ public class FirstRemindJob implements Job {
                         firstTaskService.addRemindNowork(map);
 
                         //需要推动调用这个 todo
+                        Date date = new Date();
+                        SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
+                        //发送微信消息
+                        SendMsgReq sendMsgReq = new SendMsgReq();
+                        sendMsgReq.setToUserId(userid);
+                        sendMsgReq.setTitle("提醒执行计划");
+                        sendMsgReq.setContent("您有待提醒的执行计划,请登录小程序查看【计划提醒】");
+                        sendMsgReq.setEndTime(ft.format(date));
+                        msgService.sendWechatMessage(sendMsgReq);
                     }
                 }
 

+ 13 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/init/OnsiteRemindJob.java

@@ -2,6 +2,8 @@ package com.jihengbel.intelligent.applicationtask.init;
 
 import com.jihengbel.intelligent.applicationtask.common.CommonUtil;
 import com.jihengbel.intelligent.applicationtask.entry.OnsiteCalendar;
+import com.jihengbel.intelligent.applicationtask.entry.SendMsgReq;
+import com.jihengbel.intelligent.applicationtask.service.MsgService;
 import com.jihengbel.intelligent.applicationtask.service.OnsiteTaskService;
 import com.jihengbel.intelligent.applicationtask.websocket.WsSessionManager;
 import org.quartz.DisallowConcurrentExecution;
@@ -10,6 +12,7 @@ import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 import org.springframework.web.socket.TextMessage;
 
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentMap;
@@ -205,6 +208,7 @@ public class OnsiteRemindJob implements Job {
         @Override
         public Integer call() throws Exception {
             OnsiteTaskService onsiteTaskService = (OnsiteTaskService) paramMap.get("onsiteTaskService");
+            MsgService msgService = (MsgService) paramMap.get("msgService");
             List<OnsiteCalendar> cals = onsiteTaskService.getRemindWork(paramQuery);
             String day = null;
             String format = "yyyy-MM-dd HH:mm";
@@ -248,6 +252,15 @@ public class OnsiteRemindJob implements Job {
 //                        onsiteTaskService.updateOnsiteRemindFlag(map);
 
                         //需要推动调用这个 todo
+                        Date date = new Date();
+                        SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
+                        //发送微信消息
+                        SendMsgReq sendMsgReq = new SendMsgReq();
+                        sendMsgReq.setToUserId(userid);
+                        sendMsgReq.setTitle("提醒执行计划");
+                        sendMsgReq.setContent("您有待提醒的执行计划,请登录小程序查看【计划提醒】");
+                        sendMsgReq.setEndTime(ft.format(date));
+                        msgService.sendWechatMessage(sendMsgReq);
                     }
                 }
 

+ 13 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/model/UserMapper.java

@@ -0,0 +1,13 @@
+package com.jihengbel.intelligent.applicationtask.model;
+
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author sMArT
+ * @version 1.0
+ * @date 2021-08-04 11:38 上午
+ */
+@Mapper
+public interface UserMapper {
+    String getOpenIdByUserId(Long userId);
+}

+ 18 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/service/MsgService.java

@@ -0,0 +1,18 @@
+package com.jihengbel.intelligent.applicationtask.service;
+
+import com.jihengbel.intelligent.applicationtask.entry.SendMsgReq;
+
+/**
+ * @author sMArT
+ * @version 1.0
+ * @date 2021-08-04 10:53 上午
+ */
+public interface MsgService {
+    /**
+     * 给微信用户发送消息
+     *
+     * @param sendMsgReq
+     * @return
+     */
+    String sendWechatMessage(SendMsgReq sendMsgReq);
+}

+ 19 - 5
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/service/impl/FirstTaskServiceImp.java

@@ -1,15 +1,15 @@
 package com.jihengbel.intelligent.applicationtask.service.impl;
 
-import com.jihengbel.intelligent.applicationtask.entry.ApprovalUserRes;
-import com.jihengbel.intelligent.applicationtask.entry.ApproveEntry;
-import com.jihengbel.intelligent.applicationtask.entry.FirstCalendar;
-import com.jihengbel.intelligent.applicationtask.entry.FirstTask;
+import com.jihengbel.intelligent.applicationtask.entry.*;
 import com.jihengbel.intelligent.applicationtask.model.FirstTaskMapper;
 import com.jihengbel.intelligent.applicationtask.service.FirstTaskService;
+import com.jihengbel.intelligent.applicationtask.service.MsgService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -19,6 +19,8 @@ public class FirstTaskServiceImp implements FirstTaskService {
 
     @Autowired
     FirstTaskMapper mapper;
+    @Autowired
+    MsgService msgService;
 
     /**
      * 获取对应的规则
@@ -112,7 +114,19 @@ public class FirstTaskServiceImp implements FirstTaskService {
                 approve.setTask_id(vo.getTask_id());
                 approve.setApproval_level(nextUser.getApproval_level());
                 approve.setApproval_user_id(nextUser.getUser_id().longValue());
-                return mapper.addApproveTask(approve);
+                int status = mapper.addApproveTask(approve);
+                if (status > 0) {
+                    Date date = new Date();
+                    SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
+                    //发送微信消息
+                    SendMsgReq sendMsgReq = new SendMsgReq();
+                    sendMsgReq.setToUserId(nextUser.getUser_id());
+                    sendMsgReq.setTitle("计划放行提醒");
+                    sendMsgReq.setContent("您有待放行的计划审批,请登录小程序查看【计划放行】");
+                    sendMsgReq.setEndTime(ft.format(date));
+                    msgService.sendWechatMessage(sendMsgReq);
+                }
+                return status;
             }
         }
        return 0;

+ 80 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/service/impl/MsgServiceImpl.java

@@ -0,0 +1,80 @@
+package com.jihengbel.intelligent.applicationtask.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.jihengbel.intelligent.applicationtask.common.HttpCilentUntil;
+import com.jihengbel.intelligent.applicationtask.entry.SendMsgReq;
+import com.jihengbel.intelligent.applicationtask.entry.TemplateEntry;
+import com.jihengbel.intelligent.applicationtask.model.UserMapper;
+import com.jihengbel.intelligent.applicationtask.service.MsgService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author sMArT
+ * @version 1.0
+ * @date 2021-08-04 10:56 上午
+ */
+@Service
+public class MsgServiceImpl implements MsgService {
+    @Value("${wx.minprogram.appsecret}")
+    private String appsecret;
+
+    @Value("${wx.minprogram.appid}")
+    private String appid;
+
+    @Value("${wx.minprogram.templateId}")
+    private String templateId;
+
+    @Value("${wx.minprogram.page}")
+    private String page;
+
+    @Value("${wx.minprogram.miniprogramState}")
+    private String miniprogramState;
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Override
+    public String sendWechatMessage(SendMsgReq sendMsgReq) {
+        try {
+            Map params = new HashMap();
+            params.put("secret", appsecret);
+            params.put("appid", appid);
+            params.put("grant_type", "client_credential");
+
+            HashMap<String, String> dataMap = new HashMap();
+            dataMap.put("thing1", sendMsgReq.getContent());
+            dataMap.put("thing2", sendMsgReq.getTitle());
+            dataMap.put("time3", sendMsgReq.getEndTime());
+            dataMap.put("thing4", "智云工厂系统");
+
+            String openId = userMapper.getOpenIdByUserId(sendMsgReq.getToUserId());
+            TemplateEntry template = new TemplateEntry();
+            template.setTemplate_id(templateId);
+            template.setTouser(openId);
+            template.setPage(page);
+            template.setMiniprogram_state(miniprogramState);
+            template.setData(dataMap);
+
+            String result = HttpCilentUntil.httpRequestToString(
+                    "https://api.weixin.qq.com/cgi-bin/token", params);
+            JSONObject jsonObject = JSON.parseObject(result);
+            String access_token = jsonObject.get("access_token").toString();
+            String pushUrl = new StringBuffer("https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=").append(access_token).toString();
+            result = HttpCilentUntil.httpJsonToString(pushUrl, JSON.toJSONString(template));
+            jsonObject = JSON.parseObject(result);
+            String errCode = jsonObject.get("errcode").toString();
+            String errMsg = jsonObject.get("errmsg").toString();
+            System.out.println(errCode);
+            return errCode;
+        } catch (Throwable e) {
+            e.printStackTrace();
+            return "-1";
+        }
+    }
+}

+ 19 - 5
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/service/impl/OnsiteTaskServiceImp.java

@@ -1,15 +1,15 @@
 package com.jihengbel.intelligent.applicationtask.service.impl;
 
-import com.jihengbel.intelligent.applicationtask.entry.ApprovalUserRes;
-import com.jihengbel.intelligent.applicationtask.entry.ApproveEntry;
-import com.jihengbel.intelligent.applicationtask.entry.OnsiteCalendar;
-import com.jihengbel.intelligent.applicationtask.entry.OnsiteTask;
+import com.jihengbel.intelligent.applicationtask.entry.*;
 import com.jihengbel.intelligent.applicationtask.model.OnsiteTaskMapper;
+import com.jihengbel.intelligent.applicationtask.service.MsgService;
 import com.jihengbel.intelligent.applicationtask.service.OnsiteTaskService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -21,6 +21,8 @@ public class OnsiteTaskServiceImp implements OnsiteTaskService {
 
     @Autowired
     OnsiteTaskMapper mapper;
+    @Autowired
+    private MsgService msgService;
 
     public int getTaskExistCount(Map map){
         return mapper.getTaskExistCount(map);
@@ -122,7 +124,19 @@ public class OnsiteTaskServiceImp implements OnsiteTaskService {
                 approve.setTask_id(vo.getTask_id());
                 approve.setApproval_level(nextUser.getApproval_level());
                 approve.setApproval_user_id(nextUser.getUser_id().longValue());
-                return mapper.addApproveTask(approve);
+                int status = mapper.addApproveTask(approve);
+                if (status > 0) {
+                    Date date = new Date();
+                    SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
+                    //发送微信消息
+                    SendMsgReq sendMsgReq = new SendMsgReq();
+                    sendMsgReq.setToUserId(nextUser.getUser_id());
+                    sendMsgReq.setTitle("计划放行提醒");
+                    sendMsgReq.setContent("您有待放行的计划审批,请登录小程序查看【计划放行】");
+                    sendMsgReq.setEndTime(ft.format(date));
+                    msgService.sendWechatMessage(sendMsgReq);
+                }
+                return status;
             }
         }
         return 0;

+ 3 - 0
application-task/src/main/resources/application-test.properties

@@ -30,3 +30,6 @@ onsite.remind.work.cron=0 */5 * * * ?
 first.task.cron=0 */5 * * * ? 
 #onsite 工作提醒
 first.remind.work.cron=0 */5 * * * ? 
+
+wx.minprogram.miniprogramState=trial
+

+ 6 - 0
application-task/src/main/resources/application.properties

@@ -2,3 +2,9 @@ spring.profiles.active=test
 
 mybatis.mapperLocations=classpath:mappers/*.xml
 mybatis.config-locations=conf/mybatis-config.xml
+
+wx.minprogram.appid=wxfd6e42e05b91163c
+wx.minprogram.appsecret=7c4e39a33bf8b66beb919b9ad0a15832
+wx.minprogram.templateId=3RatcsOA-T0Dsgevr-1UGvYzZvhS0UY9A86fnTFax50
+wx.minprogram.page=pages/login/index
+wx.minprogram.miniprogramState=formal

+ 14 - 0
application-task/src/main/resources/mappers/UserMapper.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.jihengbel.intelligent.applicationtask.model.UserMapper">
+
+    <select id="getOpenIdByUserId" resultType="String">
+        SELECT
+            openid
+        FROM
+            us_user_wechat
+        WHERE
+            user_id = #{userId};
+    </select>
+
+</mapper>