From e4872d9fdd9f277eacc518459418cb406570b99a Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期五, 11 九月 2026 10:57:28 +0800
Subject: [PATCH] Merge branch 'master' of http://116.62.18.175:6699/r/smartor

---
 smartor/src/main/java/com/smartor/service/IServiceExternalService.java                    |    6 
 smartor/src/main/java/com/smartor/service/impl/PatSatisfactionServiceImpl.java            |   50 +++
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/CollectHISServiceImpl.java       |  148 +++++++++-
 smartor/src/main/java/com/smartor/domain/PatSatisfaction.java                             |    4 
 smartor/src/main/resources/mapper/smartor/PatSatisfactionMapper.xml                       |    7 
 smartor/src/main/java/com/smartor/service/impl/ServiceExternalServiceImpl.java            |   88 ++++++
 ruoyi-common/src/main/java/com/ruoyi/common/utils/ArrayListUtils.java                     |   58 ++++
 smartor/src/main/java/com/smartor/mapper/PatMedOperationItemMapper.java                   |   24 +
 smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml                        |    7 
 ruoyi-quartz/src/main/resources/mapper/quartz/CollectHISMapper.xml                        |   11 
 ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml                           |    2 
 smartor/src/main/java/com/smartor/service/IPatSatisfactionService.java                    |    8 
 smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java               |   16 
 smartor/src/main/resources/mapper/smartor/PatMedInhospMapper.xml                          |    1 
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java                              |   99 ++++---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java  |   11 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/sso/SSOController.java                 |   40 ++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java         |   13 
 smartor/src/main/java/com/smartor/domain/entity/ServiceSubtaskEntity.java                 |    6 
 smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java             |   14 
 smartor/src/main/resources/mapper/smartor/PatMedOperationItemMapper.xml                   |  100 +++++++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatSatisfactionController.java |   10 
 22 files changed, 617 insertions(+), 106 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatSatisfactionController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatSatisfactionController.java
index acac05a..544bf9d 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatSatisfactionController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatSatisfactionController.java
@@ -121,14 +121,8 @@
     @Log(title = "鎮h�呮弧鎰忓害", businessType = BusinessType.INSERT)
     @PostMapping("/batchinsert")
     public AjaxResult batchinsert(@RequestBody List<PatSatisfaction> patSatisfaction) {
-        LoginUser loginUser = getLoginUser();
-        SysUser user = loginUser.getUser();
-        for (PatSatisfaction patSatisfaction1 : patSatisfaction) {
-            patSatisfaction1.setCreateBy(user.getNickName());
-            patSatisfaction1.setOrgid(user.getOrgid());
-            patSatisfactionService.insertPatSatisfaction(patSatisfaction1);
-        }
-        return toAjax(1);
+        Integer row = patSatisfactionService.batchInsert(patSatisfaction);
+        return toAjax(row);
     }
 
     /**
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
index c78d43a..3db95ac 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
@@ -1000,9 +1000,14 @@
     @PostMapping("/syncMedOperForShiyi")
     public AjaxResult syncMedOperForShiyi(@RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime) {
         // 绔嬪嵆杩斿洖锛屽悗鍙板紓姝ユ墽琛�
-        CompletableFuture.runAsync(() -> {
-            collectHISService.syncOper(startTime, endTime);
-        });
+        collectHISService.syncOper(startTime, endTime);
         return AjaxResult.success("鍚屾浠诲姟宸插惎鍔紝璇风◢鍚庢煡鐪嬬粨鏋�");
     }
+
+    @PostMapping("/dealSubtaskDeadline")
+    public AjaxResult dealSubtaskDeadline(@RequestParam("orgid") String orgid, @RequestParam("day") Integer day) {
+        // 绔嬪嵆杩斿洖锛屽悗鍙板紓姝ユ墽琛�
+        ryTask.dealSubtaskDeadline(orgid, day);
+        return AjaxResult.success("銆恉ealSubtaskDeadline銆戝悓姝ヤ换鍔″凡鍚姩锛屽ぉ鏁颁负" + day + "澶╋紝璇风◢鍚庢煡鐪嬬粨鏋�");
+    }
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sso/SSOController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sso/SSOController.java
index 3824360..7134d02 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sso/SSOController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sso/SSOController.java
@@ -14,12 +14,18 @@
 import com.ruoyi.system.service.ISysUserService;
 import com.smartor.domain.SSOTokenResponse;
 import com.smartor.domain.SSOUserInfo;
+import com.smartor.domain.ServiceSubtask;
 import com.smartor.domain.VO.ServiceSubtaskVO;
+import com.smartor.domain.entity.ServiceSubtaskEntity;
+import com.smartor.service.IServiceSubtaskService;
+import com.smartor.service.impl.ServiceSubtaskServiceImpl;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.*;
 import org.springframework.http.client.SimpleClientHttpRequestFactory;
+
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 import org.springframework.util.ObjectUtils;
@@ -32,9 +38,7 @@
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.net.URLEncoder;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
+import java.util.*;
 
 /**
  * SSO鍗曠偣鐧诲綍鎺у埗鍣�
@@ -93,6 +97,9 @@
     private ISysConfigService sysConfigService;
 
     private final RestTemplate restTemplate;
+
+    @Autowired
+    private IServiceSubtaskService serviceSubtaskService;
 
     public SSOController() {
         // 閰嶇疆RestTemplate瓒呮椂
@@ -188,6 +195,9 @@
     @GetMapping("ssoGoServiceSubtaskList")
     public RedirectView ssoGoServiceSubtaskList(@RequestParam(value = "code", required = false) String code,
                                                 @RequestParam(value = "sfzh", required = false) String sfzh) {
+        // 閲嶅畾鍚戝湴鍧�瀵硅薄(閲嶅畾鍚戝湴鍧�
+        RedirectView redirectView = new RedirectView();
+
         log.info("鏀跺埌ssoGoServiceSubtaskList璇锋眰锛屽紑濮嬮噸瀹氬悜鍒版巿鏉冩湇鍔″櫒,code = {}, sfzh = {}",code, sfzh);
         String path = sysConfigService.selectConfigByKey("sys.qddz");
         String redirectUri = "https://9.208.2.190:8092/prod-api/sso/ssoLoginLyra";
@@ -196,11 +206,21 @@
         String clientSecret = "suifangxt";
         String scope = "openid";
 
+        ServiceSubtaskEntity subtask = new ServiceSubtaskEntity();
+        subtask.setSfzh(sfzh);
+        subtask.setSort(0);
+        List<ServiceSubtask> serviceSubtaskList = serviceSubtaskService.selectServiceSubtaskList(subtask);
+        ServiceSubtask serviceSubtask = null;
+        if(CollectionUtils.isNotEmpty(serviceSubtaskList)){
+            serviceSubtask = serviceSubtaskList.get(0);
+        }else {
+            redirectView.setUrl(path + "/login?error=sso_failed");
+            return redirectView;
+        }
+
 //        String authorizeUrl = lyraPath + "/mediinfo-lyra-authserver/connect/authorize";
         String accessTokenUrl = lyraPath + "/mediinfo-lyra-authserver/connect/token";
         String userInfoUrl =  lyraPath + "/mediinfo-lyra-authserver/connect/userinfo";
-        // 閲嶅畾鍚戝湴鍧�瀵硅薄(閲嶅畾鍚戝湴鍧�
-        RedirectView redirectView = new RedirectView();
         try {
             SSOTokenResponse accessToken = getAccessTokenLyra(code, accessTokenUrl, clientId, clientSecret, redirectUri,true);
             log.info("鑾峰彇鍒扮殑token锛�" + accessToken);
@@ -223,8 +243,14 @@
                 return buildRedirect(path + "/login");
             }
 
-            String redirectUrl = path + "/loginSSO?token=" + loginToken + "&orgid=" + orgid +
-                     "&sfzh=" + sfzh + "&orgname=null&ZuHuID=null&deptCode=null";
+            String voiceType = (StringUtils.isNotEmpty(serviceSubtask.getType())
+                    && serviceSubtask.getType().equals("1")) ? "1" : "0";
+            String redirectUrl = path + "/loginSSO?token=" + loginToken +
+                    "&orgid=" + orgid + "&campusid=" + serviceSubtask.getCampusid() +
+                    "&taskid=" + serviceSubtask.getTaskid() + "&patid=" + serviceSubtask.getPatid() +
+                    "&id=" + serviceSubtask.getId() + "&voiceType=" + voiceType +
+                    "&visitCount=" + serviceSubtask.getVisitCount() + "&sfzh=" + sfzh +
+                    "&orgname=null&ZuHuID=null&deptCode=null";
             log.info("銆怱SO鐧诲綍銆戦噸瀹氬悜鍦板潃锛歿}", redirectUrl);
             return buildRedirect(redirectUrl);
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
index 7562a08..2553843 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -2,6 +2,7 @@
 
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.core.domain.entity.SysMenu;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.core.domain.entity.SysUserDept;
@@ -220,18 +221,18 @@
         ajax.put("user", user);
         ajax.put("roles", roles);
         ajax.put("permissions", permissions);
-        List<SysUserDept> sysUserDeptKSs = null;
-        List<SysUserDept> sysUserDeptBQs = null;
+        List<SysDept> sysDeptKSs = null;
+        List<SysDept> sysDeptBQs = null;
         SysUserDept sysUserDept = new SysUserDept();
         sysUserDept.setUserId(user.getUserId());
         sysUserDept.setDeptType("1");
         sysUserDept.setOrgid(user.getOrgid());
         sysUserDept.setCampusid(user.getCampusid());
-        sysUserDeptKSs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
-        ajax.put("belongDepts", sysUserDeptKSs);
+        sysDeptKSs = sysDeptService.selectLeafSysDeptListBySysUserDept(sysUserDept);
+        ajax.put("belongDepts", sysDeptKSs);
         sysUserDept.setDeptType("2");
-        sysUserDeptBQs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
-        ajax.put("belongWards", sysUserDeptBQs);
+        sysDeptBQs = sysDeptService.selectLeafSysDeptListBySysUserDept(sysUserDept);
+        ajax.put("belongWards", sysDeptBQs);
 
         return ajax;
     }
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ArrayListUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ArrayListUtils.java
new file mode 100644
index 0000000..0b3d55d
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ArrayListUtils.java
@@ -0,0 +1,58 @@
+package com.ruoyi.common.utils;
+
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+public class ArrayListUtils {
+
+    /**
+     * 鏍规嵁ID灏嗕袱涓狶ist鎷嗗垎涓猴細浠匧ist1鐙湁銆佷粎List2鐙湁銆佷袱鑰呭叡鏈�
+     *
+     * @param list1 鍒楄〃1
+     * @param list2 鍒楄〃2
+     * @param idExtractor ID鎻愬彇鍑芥暟
+     * @return Map鍖呭惈涓変釜Key: "onlyIn1", "onlyIn2", "common"
+     */
+    public static <T, K> Map<String, List<T>> splitListsById(List<T> list1, List<T> list2, Function<T, K> idExtractor) {
+        // 1. 鎻愬彇ID闆嗗悎锛岀敤浜庡揩閫熷垽鏂瓨鍦ㄦ��
+        Set<K> ids1 = list1.stream().map(idExtractor).collect(Collectors.toSet());
+        Set<K> ids2 = list2.stream().map(idExtractor).collect(Collectors.toSet());
+
+        // 2. 璁$畻ID灞傞潰鐨勫樊闆嗗拰浜ら泦
+        Set<K> onlyIn1Ids = new HashSet<>(ids1);
+        onlyIn1Ids.removeAll(ids2); // List1鐙湁鐨処D
+
+        Set<K> onlyIn2Ids = new HashSet<>(ids2);
+        onlyIn2Ids.removeAll(ids1); // List2鐙湁鐨処D
+
+        Set<K> commonIds = new HashSet<>(ids1);
+        commonIds.retainAll(ids2); // 鍏辨湁鐨処D
+
+        // 3. 鏍规嵁ID杩囨护鍘熷瀵硅薄鍒楄〃
+        List<T> onlyIn1 = list1.stream()
+                .filter(item -> onlyIn1Ids.contains(idExtractor.apply(item)))
+                .collect(Collectors.toList());
+
+        List<T> onlyIn2 = list2.stream()
+                .filter(item -> onlyIn2Ids.contains(idExtractor.apply(item)))
+                .collect(Collectors.toList());
+
+        // 娉ㄦ剰锛氬叡鏈夐儴鍒嗛�氬父鍚堝苟涓や釜鍒楄〃涓殑鍏冪礌锛屾垨鑰呭彧鍙栧叾涓竴涓��
+        // 杩欓噷绛栫暐鏄細淇濈暀list1鍜宭ist2涓墍鏈塈D閲嶅悎鐨勫璞★紙濡傛灉涓氬姟瑕佹眰鍘婚噸鎴栧悎骞跺璞″睘鎬э紝闇�棰濆澶勭悊锛�
+        List<T> common = new ArrayList<>();
+        common.addAll(list1.stream()
+                .filter(item -> commonIds.contains(idExtractor.apply(item)))
+                .collect(Collectors.toList()));
+//        common.addAll(list2.stream()
+//                .filter(item -> commonIds.contains(idExtractor.apply(item)))
+//                .collect(Collectors.toList()));
+
+        Map<String, List<T>> result = new HashMap<>();
+        result.put("onlyIn1", onlyIn1);
+        result.put("onlyIn2", onlyIn2);
+        result.put("common", common);
+
+        return result;
+    }
+}
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/CollectHISServiceImpl.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/CollectHISServiceImpl.java
index 3760141..fc3499a 100644
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/CollectHISServiceImpl.java
+++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/CollectHISServiceImpl.java
@@ -4,10 +4,13 @@
 import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.core.domain.entity.SysUserDept;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.utils.ArrayListUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.quartz.mapper.CollectHISMapper;
 import com.ruoyi.quartz.service.ICollectHISService;
 import com.smartor.domain.*;
+import com.smartor.domain.entity.ServiceSubtaskEntity;
 import com.smartor.mapper.*;
 import com.smartor.service.IPatMedOuthospService;
 import lombok.extern.slf4j.Slf4j;
@@ -60,6 +63,9 @@
     private PatArchiveMapper patArchiveMapper;
 
     @Autowired
+    private ServiceSubtaskMapper serviceSubtaskMapper;
+
+    @Autowired
     private ThreadPoolTaskExecutor taskExecutor;
 
     @Autowired
@@ -67,6 +73,9 @@
 
     @Autowired
     private UtilsMapper utilsMapper;
+
+    @Autowired
+    private RedisCache redisCache;
 
     private static final long SHARDING_THRESHOLD = 5_000_000L;
     private static final String PAT_ARCHIVE_TABLE = "pat_archive";
@@ -339,6 +348,11 @@
         log.info("鍚屾鎵嬫湳淇℃伅鏁伴噺" + patMedOperations.size());
         for (PatMedOperation operation : patMedOperations) {
             try {
+                if(ObjectUtils.isNotEmpty(operation.getCanceltime())){
+                    //浣滃簾鍒犻櫎鎿嶄綔
+                    cancelOper(operation);
+                    continue;
+                }
                 Long patId = patIdHisMap.get(operation.getPatidHis());
                 if (patId == null) {
                     patId = syncSinglePatient(operation.getPatidHis());
@@ -351,12 +365,12 @@
                     operation.setPatid(patId);
                 }
                 PatMedOperation oper = new PatMedOperation();
-                oper.setOpid(operation.getOpid());
+                oper.setOpreqid(operation.getOpreqid());
                 List<PatMedOperation> patMedOperations1 = patMedOperationMapper.selectPatMedOperationList(oper);
                 if (CollectionUtils.isNotEmpty(patMedOperations1)) {
                     operation.setId(patMedOperations1.get(0).getId());
                     operation.setUpdateTime(new Date());
-                    count += patMedOperationMapper.updatePatMedOperation(patMedOperations1.get(0));
+                    count += patMedOperationMapper.updatePatMedOperation(operation);
                     syncOperItem(operation);
                 } else {
                     operation.setCreateTime(new Date());
@@ -370,6 +384,59 @@
         return count;
     }
 
+    private Integer cancelOper(PatMedOperation oper){
+        PatMedOperation operationVo = new PatMedOperation();
+        operationVo.setOpreqid(oper.getOpreqid());
+        List<PatMedOperation> operations = patMedOperationMapper.selectPatMedOperationList(operationVo);
+        PatMedOperation operation = new PatMedOperation();
+        if(CollectionUtils.isEmpty(operations)){
+            return 0;
+        }else {
+            operation = operations.get(0);
+        }
+        log.info("鎵嬫湳浣滃簾id=" + operation.getId());
+        PatMedOperationItem pmoi = new PatMedOperationItem();
+        //鑾峰彇闇�瑕佸嚭闄㈡墜鏈殢璁匡紝鏈鐞嗙殑鏁版嵁
+        pmoi.setOpid(operation.getId().toString());
+        List<PatMedOperationItem> patMedOperationItems
+                = patMedOperationItemMapper.selectOperationItemList(pmoi);
+        List<Long> operationItemIds = patMedOperationItems.stream()
+                .map(PatMedOperationItem::getId)
+                .filter(Objects::nonNull)
+                .distinct()
+                .collect(Collectors.toList());
+
+        //涓嶉渶瑕佹湇鍔′簡锛岄渶瑕侀�氳繃patid鍜宻endstate=1,2,3,5,7鍘绘煡璇竴涓嬶紝service_subtask閲屾槸鍚︽湁姝e湪鎵ц鐨勪换鍔★紝
+        //鏈夌殑璇濓紝绔嬪嵆鍋滀簡
+        List<Long> sendstates = Arrays.asList(1L, 2L, 3L, 5L, 7L);
+        List<ServiceSubtask> serviceSubtaskList = new ArrayList<>();
+        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
+        serviceSubtaskVO.setOrgid(operation.getOrgid());
+        serviceSubtaskVO.setPatid(operation.getPatid());
+        serviceSubtaskVO.setSendstates(sendstates);
+        serviceSubtaskVO.setOperationItemIds(operationItemIds);
+        serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
+        //鍘籸edis涓紝鏌ヨ鏄惁鏈塻ubid锛屾湁鐨勮瘽绉婚櫎cache-exist
+        if (CollectionUtils.isNotEmpty(serviceSubtaskList)) {
+            for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
+                log.info("闇�瑕佺Щ闄ょ殑subId涓猴細{}", serviceSubtask.getId().toString());
+                serviceSubtask.setSendstate(4L);
+                serviceSubtask.setRemark("鎵嬫湳鎾ら攢");
+                serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
+                redisCache.removeElementFromList("cache-exist", serviceSubtask.getId().toString());
+                redisCache.removeElementFromList("cache-0", serviceSubtask.getId().toString());
+                redisCache.removeElementFromList("cache-1", serviceSubtask.getId().toString());
+                redisCache.removeElementFromList("cache-2", serviceSubtask.getId().toString());
+                redisCache.removeElementFromList("cache-3", serviceSubtask.getId().toString());
+                redisCache.removeElementFromList("cache-4", serviceSubtask.getId().toString());
+            }
+        }
+        operation.setUpdateTime(new Date());
+        patMedOperationMapper.updatePatMedOperation(operation);
+        patMedOperationItemMapper.deleteSoftPatMedOperationItemByOpId(operation.getOpid());
+        return 1;
+    }
+
     /**
      * 鍚屾鎵嬫湳淇℃伅
      *
@@ -377,34 +444,67 @@
      * @return
      */
     private Integer syncOperItem(PatMedOperation operation) {
+        if(ObjectUtils.isNotEmpty(operation.getId())){
+            operation.setOpid(operation.getId().toString());
+        }
+        operation.setUpdateTime(new Date());
+        patMedOperationMapper.updatePatMedOperation(operation);
+
         Integer count = 0;
-        PatMedOperationItem patMedOperationItem = new PatMedOperationItem();
-        patMedOperationItem.setOrgid(operation.getOrgid());
         if(StringUtils.isNotEmpty(operation.getOpid())){
-            patMedOperationItem.setOpid(operation.getOpid());
-            patMedOperationItem.setLastStartTime(operation.getLastStartTime());
-            patMedOperationItem.setLastEndTime(operation.getLastEndTime());
-            List<PatMedOperationItem> patMedOperationItems = chMapper.selectOperItemList(patMedOperationItem);
+            PatMedOperationItem patMedOperationItem = new PatMedOperationItem();
+            //patMedOperation.opReqid = patMedOperationItem.operationid
+            List<PatMedOperationItem> patMedOperationItems = new ArrayList<>();
+            if (ObjectUtils.isNotEmpty(operation.getOpreqid())){
+                patMedOperationItem.setOperationid(operation.getOpreqid());
+                patMedOperationItems = chMapper.selectOperItemList(patMedOperationItem);
+            }else {
+                log.info("鍚屾鎵嬫湳璇︽儏淇℃伅:鎵嬫湳鐢宠鍗旾D涓虹┖!");
+                return count;
+            }
+
+            PatMedOperationItem operItem = new PatMedOperationItem();
+            operItem.setOperationid(operation.getOpreqid());
+            List<PatMedOperationItem> patMedOperationItems1 = patMedOperationItemMapper.selectPatMedOperationItemList(operItem);
+
+            Map<String, List<PatMedOperationItem>> maps = ArrayListUtils.splitListsById(patMedOperationItems,
+                    patMedOperationItems1, PatMedOperationItem::getOperationid);
+            //鍙湪瑙嗗浘鐨勬暟鎹笉鍦ㄦ湰鍦扮殑鏁版嵁锛屾墽琛屾柊澧炴搷浣�
+            List<PatMedOperationItem> addItems = maps.get("onlyIn1");
+            //鍙湪鏈湴鐨勬暟鎹笉鍦ㄨ鍥剧殑鏁版嵁锛屾墽琛屽垹闄ゆ搷浣�
+            List<PatMedOperationItem> delItems = maps.get("onlyIn2");
+            //閲嶅彔鐨勬暟鎹紝鎵ц鏇存柊鎿嶄綔 patMedOperationItems鐨勬暟鎹�
+            List<PatMedOperationItem> editItems = maps.get("common");
+
             log.info("鍚屾鎵嬫湳璇︽儏淇℃伅鏁伴噺" + patMedOperationItems.size());
-            for (PatMedOperationItem operationItem : patMedOperationItems) {
-                try {
+
+            try{
+                for (PatMedOperationItem operationItem : addItems) {
                     operationItem.setInhospstate(operation.getInhospstate());
                     operationItem.setSerialnum(operation.getSerialnum());
-                    PatMedOperationItem operItem = new PatMedOperationItem();
-                    operItem.setOpid(operationItem.getOpid());
-                    operItem.setOperationid(operationItem.getOperationid());
-                    List<PatMedOperationItem> patMedOperationItems1 = patMedOperationItemMapper.selectPatMedOperationItemList(operItem);
-                    if (CollectionUtils.isNotEmpty(patMedOperationItems1)) {
-                        operationItem.setId(patMedOperationItems1.get(0).getId());
-                        operationItem.setUpdateTime(new Date());
-                        count += patMedOperationItemMapper.updatePatMedOperationItem(operationItem);
-                    } else {
-                        operation.setCreateTime(new Date());
-                        count += patMedOperationItemMapper.insertPatMedOperationItem(operationItem);
-                    }
-                } catch (Exception ex) {
-                    log.info("鍚屾鎵嬫湳璇︽儏淇℃伅:" + ex.getMessage());
+                    operationItem.setOpid(operation.getId().toString());
+                    operationItem.setOperationid(operation.getOpreqid());
+                    operationItem.setOpercheckFlag("0");
+                    operationItem.setCreateTime(new Date());
+                    count += patMedOperationItemMapper.insertPatMedOperationItem(operationItem);
                 }
+
+                for (PatMedOperationItem operationItem : delItems) {
+                    operationItem.setUpdateTime(new Date());
+                    count += patMedOperationItemMapper.deletePatMedOperationItemByOperationid(operationItem.getOperationid());
+                }
+
+                for (PatMedOperationItem operationItem : editItems) {
+                    operationItem.setInhospstate(operation.getInhospstate());
+                    operationItem.setSerialnum(operation.getSerialnum());
+                    operationItem.setOpid(operation.getId().toString());
+                    operationItem.setOperationid(operation.getOpreqid());
+                    operationItem.setUpdateTime(new Date());
+                    count += patMedOperationItemMapper.updatePatMedOperationItemByOperationid(operationItem);
+                }
+                log.info("鍚屾鎵嬫湳id={}璇︽儏淇℃伅鏁伴噺, 鏂板{}鏉★紝鍒犻櫎{}鏉★紝淇敼{}鏉�", operation.getId(), addItems.size(), delItems.size(), editItems.size());
+            } catch (Exception ex) {
+                log.info("鍚屾鎵嬫湳璇︽儏淇℃伅:" + ex.getMessage());
             }
 
 //            try {
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
index a7b1e7b..805cca7 100644
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
+++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
@@ -1771,48 +1771,65 @@
      * 澶勭悊瓒呮椂闅忚浠诲姟
      * @return
      */
-    public void dealSubtaskDeadline(Integer deadlineDay){
+    public void dealSubtaskDeadline(String orgid, Integer deadlineDay){
+        //鑾峰彇浠诲姟淇℃伅
+        ServiceTask st = new ServiceTask();
+        st.setDelFlag("0");
+        st.setLongTask(1);
+        st.setNexttaskflag("1");
+        st.setOrgid(orgid);
+        List<ServiceTask> serviceTasks = serviceTaskMapper.selectServiceTaskList(st);
+        for (ServiceTask serviceTask : serviceTasks) {
+            deadlineDay = -deadlineDay;
+            Date deadline = DateUtils.addDays(new Date(), deadlineDay);
+            //閫氳繃浠诲姟ID鎷垮埌鎮h�呬俊鎭�,骞朵笖闅忚鏃堕棿寰楁槸浠婂ぉ涔嬪墠鐨�
+            ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
+            serviceSubtaskVO.setOrgid(orgid);
+            serviceSubtaskVO.setSendstate(7L);
+            //鍙壂鎻忛娆¢殢璁跨殑
+            serviceSubtaskVO.setVisitCount(1);
+            serviceSubtaskVO.setTaskid(serviceTask.getTaskid());
+            serviceSubtaskVO.setEndOutHospTime(deadline);
+            List<ServiceSubtask> serviceSubtaskList
+                    = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
+            log.info("銆恉ealSubtaskDeadline銆戣幏鍙栧埌{}涓秴鏃朵换鍔�, taskid={}", serviceSubtaskList.size(), serviceTask.getTaskid());
+            for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
+                PatMedInhosp patMedInhospVo = new PatMedInhosp();
+                patMedInhospVo.setOrgid(serviceSubtask.getOrgid());
+                patMedInhospVo.setInhospid(serviceSubtask.getInhospid());
+                List<PatMedInhosp> patMedInhospList = iPatMedInhospService.selectPatMedInhospList(patMedInhospVo);
+                PatMedInhosp patMedInhosp = new PatMedInhosp();
+                if (!patMedInhospList.isEmpty()) {
+                    patMedInhosp = patMedInhospList.get(0);
+                }else {
+                    continue;
+                }
+                if(ObjectUtils.isEmpty(serviceTask.getNexttaskid())){
+                    continue;
+                }
+                ServiceTask nextServiceTask = serviceTaskMapper.selectServiceTaskByTaskid(serviceTask.getNexttaskid());
+                PatArchive patArchive = patArchiveService.selectPatArchiveByPatid(serviceSubtask.getPatid());
+                String config = configService.selectConfigByKey("visit.early.day");
+                Integer type = 1;
 
-        Date deadline = DateUtils.addDays(new Date(), deadlineDay);
-        //閫氳繃浠诲姟ID鎷垮埌鎮h�呬俊鎭�,骞朵笖闅忚鏃堕棿寰楁槸浠婂ぉ涔嬪墠鐨�
-        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
-        serviceSubtaskVO.setSendstate(7L);
-        serviceSubtaskVO.setVisitCount(1);
-        serviceSubtaskVO.setEndOutHospTime(deadline);
-        List<ServiceSubtask> serviceSubtaskList
-                = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
-        log.info("銆恉ealSubtaskDeadline銆戣幏鍙栧埌{}涓秴鏃朵换鍔�", serviceSubtaskList.size());
-        for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
-            PatMedInhosp patMedInhosp = new PatMedInhosp();
-            patMedInhosp.setInhospid(serviceSubtask.getInhospid());
-            List<PatMedInhosp> patMedInhospList = iPatMedInhospService.selectPatMedInhospList(patMedInhosp);
-
-            if (patMedInhospList.size() > 0) {
-                serviceSubtask.setIsVisitAgain(2);
-                serviceSubtask.setRemark(StringUtils.isNotEmpty(serviceSubtask.getRemark()) ? serviceSubtask.getRemark() + ";鎮h�呭啀鍏ラ櫌浜�" : "鎮h�呭啀鍏ラ櫌浜�");
-                serviceSubtask.setSendstate(4L);
-                serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
-                //return "鏃犻渶鍐嶆闅忚锛屾偅鑰呭啀鍏ラ櫌浜�";
-            }else {
-                continue;
-            }
-            //鏂板鍐嶆闅忚浠诲姟
-            ServiceSubtask serviceSubtaskAgain = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtask.class);
-            serviceSubtaskAgain.setId(null);
-            serviceSubtaskAgain.setUpid(serviceSubtask.getId().intValue());
-            serviceSubtaskAgain.setVisitCount(serviceSubtask.getVisitCount() + 1);
-            serviceSubtaskAgain.setSendstate(2L);
-            serviceSubtaskAgain.setCreateTime(new Date());
-            serviceSubtaskAgain.setUpdateTime(new Date());
-            serviceSubtaskAgain.setVisitType(serviceSubtask.getVisitType());
-            serviceSubtaskAgain.setVisitDeptCode(serviceSubtask.getVisitDeptCode());
-            serviceSubtaskAgain.setVisitDeptName(serviceSubtask.getVisitDeptName());
-            int i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtaskAgain);
-            if (i == 1) {
-                //鍐嶆闅忚浠诲姟鍒涘缓鎴愬姛鍚庯紝鍘熶换鍔℃敼涓哄け璐ョ姸鎬�
-                serviceSubtask.setIsVisitAgain(2);
-                serviceSubtask.setSendstate(5L);
-                serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
+                //鏂板鍐嶆闅忚浠诲姟
+                ServiceSubtask serviceSubtaskAgain = iPatMedInhospService.boxedServiceSubtask(nextServiceTask,
+                        patMedInhosp, patArchive, config, type);
+                serviceSubtaskAgain.setId(null);
+                serviceSubtaskAgain.setUpid(serviceSubtask.getId().intValue());
+                serviceSubtaskAgain.setVisitCount(serviceSubtask.getVisitCount() + 1);
+                serviceSubtaskAgain.setSendstate(2L);
+                serviceSubtaskAgain.setCreateTime(new Date());
+                serviceSubtaskAgain.setUpdateTime(new Date());
+                serviceSubtaskAgain.setVisitType(serviceSubtask.getVisitType());
+                serviceSubtaskAgain.setVisitDeptCode(serviceSubtask.getVisitDeptCode());
+                serviceSubtaskAgain.setVisitDeptName(serviceSubtask.getVisitDeptName());
+                int i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtaskAgain);
+                if (i == 1) {
+                    //鍐嶆闅忚浠诲姟鍒涘缓鎴愬姛鍚庯紝鍘熶换鍔℃敼涓哄け璐ョ姸鎬�
+                    serviceSubtask.setSendstate(5L);
+                    serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
+                }
             }
         }
     }
diff --git a/ruoyi-quartz/src/main/resources/mapper/quartz/CollectHISMapper.xml b/ruoyi-quartz/src/main/resources/mapper/quartz/CollectHISMapper.xml
index 9489fe5..9443222 100644
--- a/ruoyi-quartz/src/main/resources/mapper/quartz/CollectHISMapper.xml
+++ b/ruoyi-quartz/src/main/resources/mapper/quartz/CollectHISMapper.xml
@@ -826,6 +826,7 @@
         o.paname,
         o.opreqid,
         o.opreqcode,
+        o.canceltime,
         o.opsstatus,
         o.optypecode,
         o.optypename,
@@ -887,7 +888,7 @@
         o.nurse_name ,
         o.check_flag ,
         o.long_task_reason,
-        o.opid ,
+        null as opid ,
         o.opcode ,
         o.opdesc,
         o.oplevelcode ,
@@ -897,6 +898,9 @@
         where 1=1
         <if test="orgid != null and orgid != ''">
             AND o.orgid = #{orgid}
+        </if>
+        <if test="opreqid != null and opreqid != ''">
+            AND o.opreqid = #{opreqid}
         </if>
         <if test="lastStartTime != null and lastStartTime != ''">
             and to_char(o.last_Update_Time, 'YYYY-MM-DD HH24:MI:SS') >= #{lastStartTime}
@@ -910,7 +914,7 @@
             resultMap="PatMedOperationItemResult">
         select
                oi.operationid,
-               oi.opid,
+               null as opid,
                oi.opcode,
                oi.opdesc,
                oi.main_flag,
@@ -940,6 +944,9 @@
         <if test="opid != null and opid != ''">
             AND oi.opid = #{opid}
         </if>
+        <if test="operationid != null and operationid != ''">
+            AND oi.operationid = #{operationid}
+        </if>
         <if test="lastStartTime != null and lastStartTime != ''">
             and oi.last_Update_Time &gt;= to_date(#{lastStartTime}, 'YYYY-MM-DD HH24:MI:SS')
         </if>
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
index 4350001..1b37417 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
@@ -291,7 +291,7 @@
         and d.del_flag = 0
         and ud.del_flag = 0
         <if test="orgid != null">and d.orgid = #{orgid} and ud.orgid = #{orgid}</if>
-        <if test="campusid != null">and d.campusid = #{campusid} and ud.campusid = #{campusid}</if>
+        <if test="campusid != null">and d.campusid = #{campusid}</if>
         <if test="userId != null">and ud.user_id = #{userId}</if>
         <if test="deptType != null and deptType != ''">and d.dept_type = #{deptType}</if>
     </select>
diff --git a/smartor/src/main/java/com/smartor/domain/PatSatisfaction.java b/smartor/src/main/java/com/smartor/domain/PatSatisfaction.java
index cc29281..775146a 100644
--- a/smartor/src/main/java/com/smartor/domain/PatSatisfaction.java
+++ b/smartor/src/main/java/com/smartor/domain/PatSatisfaction.java
@@ -8,6 +8,7 @@
 import lombok.Data;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  * 鎮h�呮弧鎰忓害瀵硅薄 pat_satisfaction
@@ -155,6 +156,9 @@
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date endTime;
 
+    @ApiModelProperty(value = "涓婚敭Id闆嗗悎")
+    private List<Long> ids;
+
     /**
      * pageNum
      */
diff --git a/smartor/src/main/java/com/smartor/domain/entity/ServiceSubtaskEntity.java b/smartor/src/main/java/com/smartor/domain/entity/ServiceSubtaskEntity.java
index de813bc..0ff3281 100644
--- a/smartor/src/main/java/com/smartor/domain/entity/ServiceSubtaskEntity.java
+++ b/smartor/src/main/java/com/smartor/domain/entity/ServiceSubtaskEntity.java
@@ -799,4 +799,10 @@
 //    @Excel(name = " 鍙戦�佺姸鎬� 1 琚鍙�(鍦ㄤ换鍔′腑鏄柊寤猴紝鍦ㄦ湇鍔′腑鏄棰嗗彇)  2 寰呭彂閫�  3 宸插彂閫�  4 涓嶆墽琛�  5 鍙戦�佸け璐� 6 宸插畬鎴怽") ")
     @ApiModelProperty(value = "椤甸潰灞曠ず鐘舵�� 锛�1锛氬緟闅忚锛�1 琚鍙栥��2 寰呭彂閫併��3 宸插彂閫併��5 鍙戦�佸け璐ャ��7銆佽秴鏃讹級锛�2锛氬凡瀹屾垚锛� 6 宸插畬鎴愶級銆�3锛氭棤闇�闅忚锛�4 涓嶆墽琛岋級")
     private Long sendstateView;
+
+    @ApiModelProperty(value = "鎵嬫湳璁板綍id 瀵瑰簲pat_med_operation_item.id")
+    private Long operationItemId;
+
+    @ApiModelProperty(value = "鎵嬫湳璁板綍id闆嗗悎")
+    private List<Long> operationItemIds;
 }
diff --git a/smartor/src/main/java/com/smartor/mapper/PatMedOperationItemMapper.java b/smartor/src/main/java/com/smartor/mapper/PatMedOperationItemMapper.java
index fdab6ef..440bf66 100644
--- a/smartor/src/main/java/com/smartor/mapper/PatMedOperationItemMapper.java
+++ b/smartor/src/main/java/com/smartor/mapper/PatMedOperationItemMapper.java
@@ -53,6 +53,14 @@
     public int updatePatMedOperationItem(PatMedOperationItem patMedOperationItem);
 
     /**
+     * 淇敼鎮h�呮鏌ユ楠岃褰曞瓙
+     *
+     * @param patMedOperationItem 鎮h�呮鏌ユ楠岃褰曞瓙
+     * @return 缁撴灉
+     */
+    public int updatePatMedOperationItemByOperationid(PatMedOperationItem patMedOperationItem);
+
+    /**
      * 鍒犻櫎鎮h�呮鏌ユ楠岃褰曞瓙
      *
      * @param id 鎮h�呮鏌ユ楠岃褰曞瓙涓婚敭
@@ -77,6 +85,22 @@
     public int deleteHardPatMedOperationItemByOpId(String opid);
 
     /**
+     * 鍒犻櫎鎮h�呮鏌ユ楠岃褰曞瓙
+     *
+     * @param operationid 鎮h�呮鏌ユ楠岃褰曞瓙涓婚敭
+     * @return 缁撴灉
+     */
+    public int deletePatMedOperationItemByOperationid(Long operationid);
+
+    /**
+     * 鍒犻櫎鎮h�呮鏌ユ楠岃褰曞瓙
+     *
+     * @param opid 鎮h�呮鏌ユ楠岃褰曞瓙涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteSoftPatMedOperationItemByOpId(String opid);
+
+    /**
      * 鏌ヨ鎮h�呮鏌ユ楠岃褰曞瓙鍒楄〃
      *
      * @param patMedOperationItem 鎮h�呮鏌ユ楠岃褰曞瓙
diff --git a/smartor/src/main/java/com/smartor/service/IPatSatisfactionService.java b/smartor/src/main/java/com/smartor/service/IPatSatisfactionService.java
index 413a9c6..9282b42 100644
--- a/smartor/src/main/java/com/smartor/service/IPatSatisfactionService.java
+++ b/smartor/src/main/java/com/smartor/service/IPatSatisfactionService.java
@@ -40,6 +40,14 @@
     public int insertPatSatisfaction(PatSatisfaction patSatisfaction);
 
     /**
+     * 鎵归噺鏂板鎮h�呮弧鎰忓害
+     *
+     * @param patSatisfactions 鎮h�呮弧鎰忓害
+     * @return 缁撴灉
+     */
+    public int batchInsert(List<PatSatisfaction> patSatisfactions);
+
+    /**
      * 淇敼鎮h�呮弧鎰忓害
      *
      * @param patSatisfaction 鎮h�呮弧鎰忓害
diff --git a/smartor/src/main/java/com/smartor/service/IServiceExternalService.java b/smartor/src/main/java/com/smartor/service/IServiceExternalService.java
index 33d169d..06fde72 100644
--- a/smartor/src/main/java/com/smartor/service/IServiceExternalService.java
+++ b/smartor/src/main/java/com/smartor/service/IServiceExternalService.java
@@ -119,6 +119,12 @@
     public Boolean addOperationInfo(@RequestBody Map dataMap);
 
     /**
+     * 鎾ら攢鎵嬫湳淇℃伅
+     */
+    public Boolean cancelOperationInfo(@RequestBody Map dataMap);
+
+
+    /**
      * 鏂板鍖荤枟缁勫尰鐢�
      */
     public Boolean addMedicalTeam(Map dataMap);
diff --git a/smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java b/smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
index 114c2c1..eecbe29 100644
--- a/smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -300,7 +300,7 @@
                 } catch (Exception e) {
                     log.error("浜哄憳鍏ラ櫌绉戝澶勭悊鍑哄紓甯镐簡锛歿}", e.getMessage());
                     patMedInhosp1.setInDeptcheckFlag("2");
-                    patMedInhosp1.setLongTaskReason("浜哄憳鍏ラ櫌绉戝澶勭悊鍑哄紓甯镐簡锛�" + e.getMessage());
+                    patMedInhosp1.setLongTaskReason("浜哄憳鍏ラ櫌绉戝澶勭悊鍑哄紓甯镐簡");
                     patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                 }
             }
@@ -727,7 +727,7 @@
                             //鍐嶅叆闄㈤�昏緫
                             //鏅畞 鍑洪櫌棣栨锛�7澶╋級闅忚涓�瀹氳鍋�
                             boolean firstVisit = false;
-                            if (orgId.equals("47255004333112711A1001") && serviceSubtask1.getVisitCount() != null && serviceSubtask1.getVisitCount() == 1) {
+                            if (orgId.equals("47255004333112711A1001")) {
                                 firstVisit = true;
                             }
                             if (!firstVisit) {
@@ -865,7 +865,7 @@
         if (CollectionUtils.isEmpty(serviceTasks)) {
             log.info("璇ユ墜鏈搴旀墜鏈瓑绾х殑闀挎湡浠诲姟涓嶅瓨鍦�,浠诲姟ID涓猴細{}", taskid);
             patMedOperationItem.setOpercheckFlag("2");
-            patMedOperationItem.setLongTaskReason(longTaskReason + " & 璇ユ墜鏈搴旀墜鏈瓑绾х殑闀挎湡浠诲姟涓嶅瓨鍦�,浠诲姟ID涓�:" + taskid);
+            patMedOperationItem.setLongTaskReason(" & 璇ユ墜鏈搴旀墜鏈瓑绾х殑闀挎湡浠诲姟涓嶅瓨鍦�,浠诲姟ID涓�:" + taskid +";");
             patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem);
             return;
         } else {
@@ -971,7 +971,7 @@
                 PatMedOperationItem patMedOperationItem2 = new PatMedOperationItem();
                 patMedOperationItem2.setId(patMedOperationItem.getId());
                 patMedOperationItem2.setOpercheckFlag("2");
-                patMedOperationItem2.setRemark("鐢熸垚瀛愪换鍔″け璐� 4");
+                patMedOperationItem2.setLongTaskReason("鐢熸垚瀛愪换鍔″け璐� 4;");
                 patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem2);
             }
         } catch (Exception e) {
@@ -981,7 +981,7 @@
             PatMedOperationItem patMedOperationItem2 = new PatMedOperationItem();
             patMedOperationItem2.setId(patMedOperationItem.getId());
             patMedOperationItem2.setOpercheckFlag("2");
-            patMedOperationItem2.setRemark("鐢熸垚瀛愪换鍔℃姤閿欏洖婊� 4");
+            patMedOperationItem2.setLongTaskReason("鐢熸垚瀛愪换鍔℃姤閿欏洖婊� 4;");
             patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem2);
             e.printStackTrace();
         }
@@ -1188,7 +1188,7 @@
             newDate = addDays(patMedInhosp1.getEndtime(), serviceTask.getSendDay().intValue());
         } else {
             patMedOperationItem.setOpercheckFlag("2");
-            patMedOperationItem.setRemark(patMedOperationItem.getRemark() + "& 璇ユ偅鑰呮墜鏈嚭闄㈡椂闂翠负绌�,鎵嬫湳璇︽儏ID涓�:" + patMedOperationItem.getId());
+            patMedOperationItem.setLongTaskReason("璇ユ偅鑰呮墜鏈嚭闄㈡椂闂翠负绌�,鎵嬫湳璇︽儏ID涓�:" + patMedOperationItem.getId() + ";");
             patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem);
 //            patMedInhosp1.setDeptcheckFlag("2");
 //            patMedInhosp1.setRemark(patMedInhosp1.getRemark() + "& 璇ユ偅鑰呮墜鏈嚭闄㈡椂闂翠负绌�,鍑洪櫌璁板綍ID涓�:" + patMedInhosp1.getInhospid());
@@ -1251,7 +1251,7 @@
                         }
                         //鏅畞 鍑洪櫌棣栨锛�7澶╋級闅忚涓�瀹氳鍋�
                         boolean firstVisit = false;
-                        if (serviceSubtask1.getOrgid().equals("47255004333112711A1001") && serviceSubtask1.getVisitCount() != null && serviceSubtask1.getVisitCount() == 1) {
+                        if (serviceSubtask1.getOrgid().equals("47255004333112711A1001")) {
                             firstVisit = true;
                         }
                         if (!firstVisit) {
@@ -1324,7 +1324,7 @@
                 if (CollectionUtils.isEmpty(serviceTaskopers) || serviceTaskopers.size() == 0) {
                     PatMedOperationItem patMedOperationItem = patMedOperationItemMapper.selectPatMedOperationItemById(opItem.getId());
                     patMedOperationItem.setOpercheckFlag("2");
-                    patMedOperationItem.setLongTaskReason(patMedOperationItem.getLongTaskReason() + "鎵�鎮g殑鎵嬫湳鏈厤缃暱鏈熶换鍔�;");
+                    patMedOperationItem.setLongTaskReason("鎵�鎮g殑鎵嬫湳鏈厤缃暱鏈熶换鍔�;");
                     patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem);
                 } else {
                     for (ServiceTaskoper serviceTaskoper : serviceTaskopers) {
diff --git a/smartor/src/main/java/com/smartor/service/impl/PatSatisfactionServiceImpl.java b/smartor/src/main/java/com/smartor/service/impl/PatSatisfactionServiceImpl.java
index 8fd54d1..fd6b774 100644
--- a/smartor/src/main/java/com/smartor/service/impl/PatSatisfactionServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/PatSatisfactionServiceImpl.java
@@ -5,7 +5,11 @@
 import java.util.*;
 import java.util.stream.Collectors;
 
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.entity.SysUserDept;
+import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.utils.Arith;
+import com.ruoyi.common.utils.ArrayListUtils;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.DtoConversionUtils;
 import com.smartor.domain.*;
@@ -19,6 +23,8 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.smartor.service.IPatSatisfactionService;
+
+import static com.ruoyi.common.utils.SecurityUtils.getLoginUser;
 
 /**
  * 鎮h�呮弧鎰忓害Service涓氬姟灞傚鐞�
@@ -101,6 +107,50 @@
     }
 
     /**
+     * 鏂板鎮h�呮弧鎰忓害
+     *
+     * @param patSatisfactions 鎮h�呮弧鎰忓害
+     * @return 缁撴灉
+     */
+    @Override
+    public int batchInsert(List<PatSatisfaction> patSatisfactions) {
+        if(CollectionUtils.isEmpty(patSatisfactions)){
+            return 0;
+        }
+        List<Long> ids = patSatisfactions.stream().map(PatSatisfaction::getId).
+                distinct().collect(Collectors.toList());
+        List<PatSatisfaction> patSatisfactionsOld = new ArrayList<>();
+        PatSatisfaction patSatisfactionVo = new PatSatisfaction();
+        patSatisfactionVo.setIds(ids);
+        patSatisfactionsOld = patSatisfactionMapper.selectPatSatisfactionList(patSatisfactionVo);
+        Map<String, List<PatSatisfaction>> maps = ArrayListUtils.splitListsById(patSatisfactions,
+                patSatisfactionsOld, PatSatisfaction::getId);
+        //鍙湪patSatisfactions鐨勬暟鎹紝鎵ц鏂板鎿嶄綔
+        List<PatSatisfaction> addItems = maps.get("onlyIn1");
+        //鍙湪patSatisfactionsOld鐨勬暟鎹紝鎵ц鍒犻櫎鎿嶄綔
+//        List<PatSatisfaction> delItems = maps.get("onlyIn2");
+        //閲嶅彔鐨勬暟鎹紝鎵ц鏇存柊鎿嶄綔
+        List<PatSatisfaction> editItems = maps.get("common");
+        Integer count = 0;
+        LoginUser loginUser = getLoginUser();
+        SysUser user = loginUser.getUser();
+        for (PatSatisfaction patSatisfaction0 : editItems) {
+            patSatisfaction0.setUpdateBy(user.getNickName());
+            patSatisfaction0.setUpdateTime(DateUtils.getNowDate());
+            count = count + patSatisfactionMapper.updatePatSatisfaction(patSatisfaction0);
+        }
+
+        for (PatSatisfaction patSatisfaction1 : addItems) {
+            patSatisfaction1.setCreateBy(user.getNickName());
+            patSatisfaction1.setOrgid(user.getOrgid());
+            patSatisfaction1.setCreateTime(DateUtils.getNowDate());
+            patSatisfaction1.setUpdateTime(DateUtils.getNowDate());
+            count = count + patSatisfactionMapper.insertPatSatisfaction(patSatisfaction1);
+        }
+        return count;
+    }
+
+    /**
      * 淇敼鎮h�呮弧鎰忓害
      *
      * @param patSatisfaction 鎮h�呮弧鎰忓害
diff --git a/smartor/src/main/java/com/smartor/service/impl/ServiceExternalServiceImpl.java b/smartor/src/main/java/com/smartor/service/impl/ServiceExternalServiceImpl.java
index a83ab65..e7c2dc4 100644
--- a/smartor/src/main/java/com/smartor/service/impl/ServiceExternalServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/ServiceExternalServiceImpl.java
@@ -816,10 +816,16 @@
             patMedInhosp1.setDiagname(StringUtils.isNotEmpty(patMedInhosp1.getLeavediagname()) ? patMedInhosp1.getLeavediagname() : hospPatientDiagnoseInfos2.get(0).getZhenDuanMC());
         }
 
-        patMedInhosp1.setInhospstate("1");
+        String orgid = ObjectUtils.isNotEmpty(BingRenXX) && ObjectUtils.isNotEmpty(BingRenXX.get("ZuZhiJGID")) ? BingRenXX.get("ZuZhiJGID").toString() : null;
+        if(StringUtils.isNotEmpty(orgid) && orgid.equals("47246103233112211A1001")){
+            //缂欎簯浜岄櫌 浣忛櫌璁板綍涓嶆洿鏂扮姸鎬�
+        }else {
+            patMedInhosp1.setInhospstate("1");
+        }
+
         if (CollectionUtils.isNotEmpty(patMedInhospList)) {
             patMedInhosp1.setUpdateTime(new Date());
-            patMedInhosp1.setOrgid(ObjectUtils.isNotEmpty(BingRenXX) && ObjectUtils.isNotEmpty(BingRenXX.get("ZuZhiJGID")) ? BingRenXX.get("ZuZhiJGID").toString() : null);
+            patMedInhosp1.setOrgid(orgid);
             if (CollectionUtils.isNotEmpty(noLongTask) && noLongTask.contains(patMedInhosp1.getOrgid())) {
                 //涓嶉渶瑕侀暱鏈熶换鍔¢殢璁�
                 patMedInhosp1.setFuflag("0");
@@ -832,7 +838,7 @@
                 patMedInhosp1.setHospitalcode(ObjectUtils.isNotEmpty(BingRenXX.get("ZuZhiJGID")) ? BingRenXX.get("ZuZhiJGID").toString() : null);
                 patMedInhosp1.setLeavehospitaldistrictname(ObjectUtils.isNotEmpty(BingRenXX.get("DangQianBQMC")) ? BingRenXX.get("DangQianBQMC").toString() : null);
                 patMedInhosp1.setLeavehospitaldistrictcode(ObjectUtils.isNotEmpty(BingRenXX.get("DangQianBQID")) ? BingRenXX.get("DangQianBQID").toString() : null);
-                patMedInhosp1.setOrgid(ObjectUtils.isNotEmpty(BingRenXX.get("ZuZhiJGID")) ? BingRenXX.get("ZuZhiJGID").toString() : null);
+                patMedInhosp1.setOrgid(orgid);
                 //涓芥按鏃犻櫌鍖猴紝榛樿鍊兼槸 1
                 patMedInhosp1.setCampusid("1");
                 patMedInhosp1.setPatno(ObjectUtils.isNotEmpty(BingRenXX.get("BingRenID")) ? BingRenXX.get("BingRenID").toString() : null);
@@ -1514,6 +1520,81 @@
         return true;
     }
 
+    @Override
+    public Boolean cancelOperationInfo(Map dataMap) {
+        log.info("ServiceExternalServiceImpl---cancelOperationInfo鐨勬挙閿�鐨勫�间负锛歿}", dataMap);
+
+        Map yeWuXX = (Map) dataMap.get("YeWuXX");
+        Map<String, Object> BingRenXX = ObjectUtils.isNotEmpty(yeWuXX) ? (Map<String, Object>) yeWuXX.get("BingRenXX") : null;
+        ExternalInHospPatientInfo externalInHospPatientInfo = BeanUtil.mapToBean(BingRenXX, ExternalInHospPatientInfo.class, true);
+        PatArchive patArchive = addPatArchive(externalInHospPatientInfo, null, null);
+        //鎵嬫湳鎾ら攢
+        Map<String, Object> sscx = ObjectUtils.isNotEmpty(yeWuXX) ? (Map<String, Object>) yeWuXX.get("ShouShuCX") : null;
+        ExternalOperationInfo externalOperationInfo = null;
+        if (ObjectUtils.isNotEmpty(sscx))
+            externalOperationInfo = BeanUtil.mapToBean(sscx, ExternalOperationInfo.class, true);
+        PatMedOperation patMedOperation = new PatMedOperation();
+        patMedOperation.setPatid(patArchive.getId());
+        patMedOperation.setOrgid(patArchive.getOrgid());
+        patMedOperation.setOpreqcode(externalOperationInfo.getShenQingDID());
+        //鏌ヨ涓�涓嬶紝璇ユ偅鑰呮槸鍚﹀凡缁忔湁杩欎簺鏁版嵁
+        List<PatMedOperation> patMedOperations = patMedOperationMapper.selectPatMedOperationList(patMedOperation);
+        if (CollectionUtils.isNotEmpty(patMedOperations)) {
+            for(PatMedOperation operation : patMedOperations){
+                Long id = operation.getId();
+                //濡傛灉鎵嬫湳鎾ら攢锛岀洿鎺ュ垹闄よ鏉℃墜鏈俊鎭�
+                if (ObjectUtils.isNotEmpty(sscx)) {
+                    operation.setId(id);
+                    operation.setCheckFlag("1");
+                    operation.setDelFlag("1");
+                    //鍚屾椂鍘绘煡璇紝鏄惁鍦╯ubtask涓敓鎴愪换鍔★紝濡傛灉鐢熸垚鍑哄緱绔嬮┈鍒犻櫎
+                    //            鎵嬫湳闅忚
+                    PatMedOperationItem pmoi = new PatMedOperationItem();
+                    //鑾峰彇闇�瑕佸嚭闄㈡墜鏈殢璁匡紝鏈鐞嗙殑鏁版嵁
+                    pmoi.setOpid(operation.getId().toString());
+                    List<PatMedOperationItem> patMedOperationItems
+                            = patMedOperationItemMapper.selectOperationItemList(pmoi);
+                    List<Long> operationItemIds = patMedOperationItems.stream()
+                            .map(PatMedOperationItem::getId)
+                            .filter(Objects::nonNull)
+                            .distinct()
+                            .collect(Collectors.toList());
+
+
+                    //涓嶉渶瑕佹湇鍔′簡锛岄渶瑕侀�氳繃patid鍜宻endstate=1,2,3,5,7鍘绘煡璇竴涓嬶紝service_subtask閲屾槸鍚︽湁姝e湪鎵ц鐨勪换鍔★紝
+                    //鏈夌殑璇濓紝绔嬪嵆鍋滀簡
+                    List<Long> sendstates = Arrays.asList(1L, 2L, 3L, 5L, 7L);
+                    List<ServiceSubtask> serviceSubtaskList = new ArrayList<>();
+                    ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
+                    serviceSubtaskVO.setOrgid(patArchive.getOrgid());
+                    serviceSubtaskVO.setPatid(patArchive.getId());
+                    serviceSubtaskVO.setSendstates(sendstates);
+                    serviceSubtaskVO.setOperationItemIds(operationItemIds);
+                    serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
+                    //鍘籸edis涓紝鏌ヨ鏄惁鏈塻ubid锛屾湁鐨勮瘽绉婚櫎cache-exist
+                    if (CollectionUtils.isNotEmpty(serviceSubtaskList)) {
+                        for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
+                            log.info("闇�瑕佺Щ闄ょ殑subId涓猴細{}", serviceSubtask.getId().toString());
+                            serviceSubtask.setSendstate(4L);
+                            serviceSubtask.setRemark("鎵嬫湳鎾ら攢");
+                            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
+                            redisCache.removeElementFromList("cache-exist", serviceSubtask.getId().toString());
+                            redisCache.removeElementFromList("cache-0", serviceSubtask.getId().toString());
+                            redisCache.removeElementFromList("cache-1", serviceSubtask.getId().toString());
+                            redisCache.removeElementFromList("cache-2", serviceSubtask.getId().toString());
+                            redisCache.removeElementFromList("cache-3", serviceSubtask.getId().toString());
+                            redisCache.removeElementFromList("cache-4", serviceSubtask.getId().toString());
+                        }
+                    }
+                    operation.setUpdateTime(new Date());
+                    patMedOperationMapper.updatePatMedOperation(operation);
+                    patMedOperationItemMapper.deleteSoftPatMedOperationItemByOpId(operation.getOpid());
+                }
+            }
+        }
+        return true;
+    }
+
     //鏂板鎮h�呭熀鏈俊鎭�
     private PatArchive addPatArchive(ExternalInHospPatientInfo externalInHospPatientInfo, ExternalInHospPatientAddrInfo externalInHospPatientAddrInfo, ExternalInHospPatientLiaisonInfo externalInHospPatientLiaisonInfo) {
         Date parse = null;
@@ -2007,6 +2088,7 @@
                 return true;
             case "SM_SQ_CheXiao":
                 log.info("鎵嬫湳鎾ら攢鍏ュ弬绫诲瀷涓猴細{}", type);
+                cancelOperationInfo(dataMap);
                 return true;
             case "TJ_YW_BaoGaoXX":
                 log.info("浣撴鎶ュ憡鍏ュ弬绫诲瀷涓猴細{}", type);
diff --git a/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java b/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
index a79ba27..06ffc4c 100644
--- a/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -706,8 +706,12 @@
         patMedInhosp.setInhospstate("0");
         List<PatMedInhosp> patMedInhospList = patMedInhospMapper.selectPatMedInhospList(patMedInhosp);
         PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(serviceSubtask1.getPatid());
-
-        if (patMedInhospList.size() > 0) {
+        //鏅畞 鏂板鍐嶆闅忚涓嶈兘瑙﹀彂鎮h�呭啀鍏ラ櫌
+        boolean inhospAgain = true;
+        if (serviceSubtask1.getOrgid().equals("47255004333112711A1001")) {
+            inhospAgain = false;
+        }
+        if (patMedInhospList.size() > 0 && inhospAgain) {
             serviceSubtask1.setIsVisitAgain(2);
             serviceSubtask1.setRemark(StringUtils.isNotEmpty(serviceSubtask.getRemark()) ? serviceSubtask.getRemark() + ";鎮h�呭啀鍏ラ櫌浜�" : "鎮h�呭啀鍏ラ櫌浜�");
             serviceSubtask1.setSendstate(4L);
@@ -2887,6 +2891,12 @@
                 collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrcode()).orElse("Unknown")));
                 break;
             case "management_doctor_code":
+                rawData = rawData.stream()
+                        .peek(item -> {
+                            item.setDrname(item.getManagementDoctor());
+                            item.setDrcode(item.getManagementDoctorCode());
+                        })
+                        .collect(Collectors.toList());
                 collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getManagementDoctorCode()).orElse("Unknown")));
                 break;
             case "deptcode":
diff --git a/smartor/src/main/resources/mapper/smartor/PatMedInhospMapper.xml b/smartor/src/main/resources/mapper/smartor/PatMedInhospMapper.xml
index 5f9666b..8344a5f 100644
--- a/smartor/src/main/resources/mapper/smartor/PatMedInhospMapper.xml
+++ b/smartor/src/main/resources/mapper/smartor/PatMedInhospMapper.xml
@@ -246,6 +246,7 @@
         AND a.del_flag = 0
         AND b.del_flag = 0
         AND a.idcardno IS NOT NULL
+        <if test="inhospid != null">and b.inhospid = #{inhospid}</if>
         <if test="startOutHospTime != null ">and date_format(b.endtime,'%y%m%d') &gt;=
             date_format(#{startOutHospTime},'%y%m%d')
         </if>
diff --git a/smartor/src/main/resources/mapper/smartor/PatMedOperationItemMapper.xml b/smartor/src/main/resources/mapper/smartor/PatMedOperationItemMapper.xml
index 8f3df5b..f654970 100644
--- a/smartor/src/main/resources/mapper/smartor/PatMedOperationItemMapper.xml
+++ b/smartor/src/main/resources/mapper/smartor/PatMedOperationItemMapper.xml
@@ -309,6 +309,86 @@
         where id = #{id}
     </update>
 
+    <update id="updatePatMedOperationItemByOperationid" parameterType="com.smartor.domain.PatMedOperationItem">
+        update pat_med_operation_item
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="opid != null">opid =
+                #{opid},
+            </if>
+            <if test="opcode != null">opcode =
+                #{opcode},
+            </if>
+            <if test="opdesc != null">opdesc =
+                #{opdesc},
+            </if>
+            <if test="mainFlag != null">main_flag =
+                #{mainFlag},
+            </if>
+            <if test="incitypecode != null">incitypecode =
+                #{incitypecode},
+            </if>
+            <if test="incitypedesc != null">incitypedesc =
+                #{incitypedesc},
+            </if>
+            <if test="oplevelcode != null">oplevelcode =
+                #{oplevelcode},
+            </if>
+            <if test="opleveldesc != null">opleveldesc =
+                #{opleveldesc},
+            </if>
+            <if test="opposition != null">opposition =
+                #{opposition},
+            </if>
+            <if test="delFlag != null">del_flag =
+                #{delFlag},
+            </if>
+            <if test="updateBy != null">update_by =
+                #{updateBy},
+            </if>
+            <if test="updateTime != null">update_time =
+                #{updateTime},
+            </if>
+            <if test="createBy != null">create_by =
+                #{createBy},
+            </if>
+            <if test="createTime != null">create_time =
+                #{createTime},
+            </if>
+            <if test="isupload != null">isupload =
+                #{isupload},
+            </if>
+            <if test="uploadTime != null">upload_time =
+                #{uploadTime},
+            </if>
+            <if test="orgid != null">orgid =
+                #{orgid},
+            </if>
+            <if test="pguid != null">pguid =
+                #{pguid},
+            </if>
+            <if test="guid != null">guid =
+                #{guid},
+            </if>
+            <if test="pid != null">pid =
+                #{pid},
+            </if>
+            <if test="opercheckFlag != null">opercheck_flag =
+                #{opercheckFlag},
+            </if>
+            <if test="longTaskReason != null">long_task_reason =
+                #{longTaskReason},
+            </if>
+            <if test="inhospstate != null">inhospstate =
+                #{inhospstate},
+            </if>
+            <if test="serialnum != null">serialnum =
+                #{serialnum},
+            </if>
+        </trim>
+        where operationid = #{operationid}
+        and opcode = #{opcode}
+    </update>
+
     <insert id="insertPatMedOperationItems">
         insert into pat_med_operation_item
         <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -442,7 +522,25 @@
     <delete id="deleteHardPatMedOperationItemByOpId" parameterType="String">
         delete from pat_med_operation_item
                where opid = #{opid}
+               and opercheck_flag != 1
     </delete>
+
+    <update id="deletePatMedOperationItemByOperationid" parameterType="Long">
+        update  pat_med_operation_item
+        <trim prefix="SET" suffixOverrides=",">
+            del_flag =1
+        </trim>
+        where operationid = #{operationid}
+        and opercheck_flag != 1
+    </update>
+
+    <update id="deleteSoftPatMedOperationItemByOpId" parameterType="String">
+        update pat_med_operation_item
+        <trim prefix="SET" suffixOverrides=",">
+            del_flag =1
+        </trim>
+        where opid = #{opid}
+    </update>
 
     <select id="selectOperationItemList" parameterType="com.smartor.domain.PatMedOperationItem"
             resultMap="PatMedOperationItemResult">
@@ -457,7 +555,7 @@
         from pat_med_operation pmo
         join pat_med_operation_item pmoi
         on pmoi.opid = pmo.opid
-        left join pat_med_inhosp pmi
+        join pat_med_inhosp pmi
         on pmo.serialnum = pmi.serialnum
         where
         pmo.del_flag = '0'
diff --git a/smartor/src/main/resources/mapper/smartor/PatSatisfactionMapper.xml b/smartor/src/main/resources/mapper/smartor/PatSatisfactionMapper.xml
index 17eb494..21125bd 100644
--- a/smartor/src/main/resources/mapper/smartor/PatSatisfactionMapper.xml
+++ b/smartor/src/main/resources/mapper/smartor/PatSatisfactionMapper.xml
@@ -114,6 +114,13 @@
             <if test="endTime != null">
                 AND date_format(update_time,'%y%m%d') &lt;= date_format(#{endTime},'%y%m%d')
             </if>
+            <if test="ids != null and ids.size()>0">
+                AND id IN
+                <foreach collection="ids" item="idItem" open="(" separator=","
+                         close=")">
+                    #{idItem}
+                </foreach>
+            </if>
     </select>
 
     <select id="selectPatSatisfactionById" parameterType="Long"
diff --git a/smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml b/smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
index 118719e..4910e68 100644
--- a/smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
+++ b/smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
@@ -358,6 +358,12 @@
                 #{itemTaskId}
             </foreach>
         </if>
+        <if test="operationItemIds != null and operationItemIds.size() > 0">
+            AND operation_item_id IN
+            <foreach collection="operationItemIds" item="operationItemIdItem" open="(" separator="," close=")">
+                #{operationItemIdItem}
+            </foreach>
+        </if>
         <if test="templateid != null  and templateid != ''">and templateid = #{templateid}</if>
         <if test="templatename != null  and templatename != ''">and templatename like concat('%', #{templatename},
             '%')
@@ -483,6 +489,7 @@
         <if test="libtemplatename != null ">and libtemplatename = #{libtemplatename}</if>
         <if test="openid != null ">and openid = #{openid}</if>
         <if test="sendstate != null ">and sendstate = #{sendstate}</if>
+        <if test="operationItemId != null ">and operation_item_id = #{operationItemId}</if>
         <if test="drname != null  and drname != ''">and drname like concat('%', #{drname}, '%')</if>
         <if test="taskName != null  and taskName != ''">and task_name like concat('%', #{taskName}, '%')</if>
         <if test="drcode != null and drcode != ''">and (drcode = #{drcode}</if>

--
Gitblit v1.9.3