陈昶聿
2 天以前 a1d7878bc5e76eccce087f758fc3b3e1f1cf5af3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
package com.ruoyi.task.service;
 
import com.ruoyi.common.core.domain.AjaxResult;
import org.springframework.web.bind.annotation.RequestBody;
 
import java.util.Date;
import java.util.List;
import java.util.Map;
 
import com.ruoyi.template.domain.VO.HeLibraryCountVO;
import com.ruoyi.template.domain.IvrTaskTemplateTargetoption;
import com.ruoyi.task.domain.entity.ServiceSubtaskEntity;
import com.ruoyi.task.domain.ServiceStatisticsRequest;
import com.ruoyi.task.domain.ServiceStatisticsResponse;
import com.ruoyi.task.domain.ServiceSubtask;
import com.ruoyi.task.domain.ServiceSubtaskCount;
import com.ruoyi.task.domain.ServiceSubtaskCountReq;
import com.ruoyi.task.domain.ServiceSubtaskScriptCount;
import com.ruoyi.task.domain.ServiceSubtaskStatistic;
import com.ruoyi.task.domain.ServiceTask;
import com.ruoyi.task.domain.VO.ServiceSubtaskCotinueCountVO;
import com.ruoyi.task.domain.PatArchiveSrmVO;
import com.ruoyi.task.domain.ServiceSubtaskDiagname;
import com.ruoyi.task.domain.ServiceSubtaskIsAbnormalStatistic;
import com.ruoyi.task.domain.ServiceSubtaskRes;
import com.ruoyi.task.domain.ServiceSubtaskTemplateVO;
import com.ruoyi.task.domain.ServiceTaskVO;
import com.ruoyi.task.domain.VO.TransferDeptVO;
/**
 * 单一任务(随访)Service接口
 *
 * @author ruoyi
 * @date 2024-02-02
 */
public interface IServiceSubtaskService {
    /**
     * 丽水中医院 orgid。
     * 微信公众号已领取未填写按默认选项完成,暂时只对该机构生效,其他医院仍走原补偿逻辑。
     */
    String WECHAT_DEFAULT_COMPLETE_ORGID = "47231022633110211A2101";
 
    /**
     * 查询单一任务(随访)
     *
     * @param id 单一任务(随访)主键
     * @return 单一任务(随访)
     */
    public ServiceSubtask selectServiceSubtaskById(Long id);
 
    public List<ServiceSubtask> selectServiceSubtaskByDiagname(ServiceSubtask serviceSubtask);
 
    /**
     * 查询单一任务(随访)列表
     *
     * @param serviceSubtaskVO 单一任务(随访)
     * @return 单一任务(随访)集合
     */
    public List<ServiceSubtask> selectServiceSubtaskList(ServiceSubtaskEntity serviceSubtaskVO);
 
    public List<ServiceSubtask> selectServiceSubtaskListAgain(ServiceSubtaskEntity serviceSubtaskVO);
 
    /**
     * 根据条件查询任务信息
     *
     * @param ServiceSubtask
     * @return
     */
    public ServiceTaskVO queryTaskByCondition(ServiceSubtask ServiceSubtask);
 
    /**
     * 查询患者随访信息
     */
    public List<ServiceSubtaskRes> patItem(ServiceSubtaskEntity serviceSubtaskEntity);
 
    public List<ServiceSubtask> getServiceSubtasks(ServiceSubtaskEntity serviceSubtaskEntity);
 
    /**
     * 转移科室病区
     *
     * @param transferDeptVO
     * @return
     */
    public Integer transferDept(TransferDeptVO transferDeptVO);
 
    public List<ServiceSubtask> patItem2(ServiceSubtaskEntity serviceSubtaskEntity);
 
    public Map<String, Object> patItemCount(ServiceSubtaskEntity serviceSubtaskEntity);
 
    public Map<String, Object> countByCondition(ServiceSubtaskEntity serviceSubtaskEntity);
 
    /**
     * 新增单一任务(随访)
     *
     * @param ServiceSubtask 单一任务(随访)
     * @return 结果
     */
    public Map<String, Object> insertServiceSubtask(ServiceSubtask ServiceSubtask);
 
    /**
     * 再次新增单一任务(随访)
     *
     * @param ServiceSubtask 再次新增单一任务(随访)
     * @return 结果
     */
    public String addSubTaskAgain(ServiceSubtask ServiceSubtask);
 
    /**
     * 首次随访任务超时后,按下一任务自动生成再次随访任务(随访中心)。
     * <p>
     * 与手动入口的差异:随访中心科室未配置时回退原任务科室;同一原任务只生成一条(锁 + 条件更新幂等)。
     *
     * @param serviceSubtask 已超时的首次随访子任务
     * @return 结果描述
     */
    public String addSubTaskAgainByDeadline(ServiceSubtask serviceSubtask);
 
    /**
     * 修改单一任务(随访)
     *
     * @param ServiceSubtask 单一任务(随访)
     * @return 结果
     */
    public Boolean updateServiceSubtask(ServiceSubtask ServiceSubtask);
 
    /**
     * 子任务模板修改
     *
     * @param serviceSubtaskTemplateVO
     * @return
     */
    public Boolean updateTemplate(ServiceSubtaskTemplateVO serviceSubtaskTemplateVO);
 
    /**
     * 批量删除单一任务(随访)
     *
     * @param ids 需要删除的单一任务(随访)主键集合
     * @return 结果
     */
    public int deleteServiceSubtaskByIds(Long[] ids);
 
    /**
     * 新增宣教任务
     *
     * @param ivrTaskVO 单一任务
     * @return 结果
     */
    public Map<String, Integer> insertOrUpdateTask(ServiceTaskVO ivrTaskVO);
 
 
    /*
     * ------------------------------------------------------------------
     * 电话相关的 7 个方法(phoneCallBack / phoneCallBackYQ / getFirstQues /
     * processResust / taskPull / saveQuestionAnswerPhone / recordAccept)
     * 已随电话模块化整体搬进 ruoyi-phone:
     *   接口 -> com.ruoyi.phone.service.IPhoneService
     *   实现 -> com.ruoyi.phone.service.impl.PhoneServiceImpl
     *   对外 -> com.ruoyi.phone.api.PhoneFacade(其它模块从这里调电话能力)
     * URL 保持不变,线上电话平台无需改动。
     * ------------------------------------------------------------------
     */
 
    /**
     * 获取随访、复诊量
     *
     * @param serviceSubtaskCountReq
     * @return
     */
    public List<ServiceSubtaskCount> getSfFzInfoEveryMonth(ServiceSubtaskCountReq serviceSubtaskCountReq);
 
    public List<ServiceSubtaskStatistic> getSfStatistics(ServiceSubtaskCountReq serviceSubtaskCountReq);
 
    public List<ServiceSubtaskStatistic> getSpecialSfStatistics(ServiceSubtaskCountReq serviceSubtaskCountReq);
 
    //导出随访
    public List<ServiceSubtaskStatistic> getSfStatisticsExport(ServiceSubtaskCountReq serviceSubtaskCountReq);
 
    //导出随访-异常
    public List<ServiceSubtaskIsAbnormalStatistic> getSfStatisticsIsAbnormalExport(ServiceSubtaskCountReq serviceSubtaskCountReq);
 
    public List<ServiceSubtaskStatistic> getSfStatisticsJoy(ServiceSubtaskCountReq serviceSubtaskCountReq);
 
    public List<ServiceSubtaskCount> getSfStatisticsJoydetails(ServiceSubtaskCountReq serviceSubtaskCountReq);
 
    public List<ServiceSubtask> getSfStatisticsHyperlink(ServiceSubtaskCountReq serviceSubtaskCountReq);
 
    public List<ServiceStatisticsResponse> getServiceStatistics(ServiceStatisticsRequest request);
 
    public List<ServiceSubtaskStatistic> getSfStatisticsScript(ServiceSubtaskCountReq serviceSubtaskCountReq);
 
    public Map<String, Object> getSfStatisticsScriptDetails(ServiceSubtaskCountReq serviceSubtaskCountReq);
 
    /**
     * 问题选项数字下钻:查询选择了指定选项的 service_subtask 列表
     *
     * @param serviceSubtaskCountReq 统计维度、科室/病区、任务、题目及选项条件
     * @return service_subtask 列表
     */
    public List<ServiceSubtask> getSfStatisticsScriptDetailsHyperlink(ServiceSubtaskCountReq serviceSubtaskCountReq);
 
    public List<PatArchiveSrmVO> sendMsgTemplate(List<PatArchiveSrmVO> patArchiveSrmVOS);
 
    public List<ServiceSubtaskDiagname> convertToDiagnameList(List<ServiceSubtask> subtaskList);
 
    /**
     * 统计任务各种状态的数量 -【随访工作台】
     *
     * @param entity 查询条件(科室/病区权限、soonTimeoutHours 即将超时小时数等)
     * @return 含 pendingVisitCount、failedVisitCount、abnormalVisitCount、warnningVisitCount、
     * allVisitCount、soonTimeoutCount 的统计结果
     */
    public Map<String, Object> getCurrentUserServiceSubtaskCount(ServiceSubtaskEntity entity);
 
    /**
     * 当前登录人待处理随访任务,按出院年月分组统计(出院随访、门诊随访分开计数)
     * <p>
     * 口径:出院随访 service_type='2'、门诊随访 service_type='3'
     * + 待随访状态(sendstate in 1,2,3,5,7)
     * + 出院满 7 天(含「7 天前那一天」出院的患者),且只看最近 4 个出院月份(含当月)。
     *
     * @param entity 查询条件(orgid、科室、病区)
     * @return { total: 总数量, months: [{ month: 'yyyy-MM', dischargeCount: 出院随访数量, outpatientCount: 门诊随访数量 }] }
     * 只返回有数据的月份,没有数据的月份由前端补 0
     */
    public Map<String, Object> getPendingManualTaskMonthStats(ServiceSubtaskEntity entity);
 
    /**
     * 按病区或科室统计延续护理数量
     * 都不传时同时按病区和科室各统计一遍
     *
     * @param vo 查询条件(leavehospitaldistrictcodes 与 deptcodes 互斥)
     * @return noContinueCount、ContinueCount 及 detail 列表
     */
    Map<String, Object> getContinueNurseCount(ServiceSubtaskCotinueCountVO vo);
 
    /**
     * 设置失败任务默认值,并将失败任务重新置为成功
     * <p>
     * *@param failDay   (失败天数:距离当前日期失败天数)
     *
     * @return
     */
    public void setFailSubTaskDefalutVal(Long failDay);
 
    /**
     * 微信公众号已领取未填写:按题目默认选项补齐当前子任务,并将当前子任务完成。
     * <p>
     * 仅处理传入的当前子任务(subid),只允许:
     * 问卷类型(type=2)、当前发送方式为公众号(5)、子任务已领取(1)、未提交(submit!=1)、
     * 当前公众号发送方式为已发送(2)/已领取(3) 的数据。
     * 其他任务、其他发送方式、其他子任务均不受影响。
     *
     * @param serviceSubtask 当前子任务
     * @return true=已按默认选项完成;false=不满足条件或没有可填充的默认选项
     */
    public Boolean completeWechatClaimedByDefault(ServiceSubtask serviceSubtask);
 
    public Map<String, Object> getHeLibraryCount(@RequestBody HeLibraryCountVO heLibraryCountVO);
 
    public List<ServiceSubtask> gethelibraryCountHyperlink(@RequestBody HeLibraryCountVO heLibraryCountVO);
 
    Map<String, Object> smsSubTask(Long subid);
 
    /**
     * 丽水中医院微信公众号发送:master 新增的对外入口(实现类同名方法)。
     * <p>
     * 与 {@link #smsSubTask(Long)} 的区别:短信请走 ruoyi-message 的 SmsSenderFactory,
     * 该入口只做丽水微信特有的链路,供需要直发公众号的调用方使用。
     */
    Map<String, Object> weChatSubTask(Long subid);
 
    
 
    
 
    
 
    public String scanGenerateSubtask(ServiceTask serviceTaskVo);
 
    
 
    
 
    /**
     * AI 选项匹配(把 options 序列化后 POST 到外部 AI 服务)。
     * <p>
     * ⚠️ 入参改成<b>泛型</b> {@code List<T>}(原为 {@code List<IvrTaskTemplateTargetoption>}):
     * 那个类型已随模板模块化搬进 {@code ruoyi-template},而本方法要经
     * {@code SubtaskOptionMatchApiBridge} 向模板模块暴露(接口在 ruoyi-common)。
     * 泛型让模板模块不必知道 {@code T} 是什么,同时保持 smartor 内部 4 处调用点形状不变。
     * <p>
     * 语义无变化:方法体只做 {@code jsonObject.put("options", options)} 后整体序列化,
     * 从不读 {@code T} 的字段。
     */
    public <T> Integer matchOptionIndex(String url, String questionText, String voiceText, List<T> options, String uuid);
 
    
}