瀏覽代碼

添加违规收费分析模块。

lighter 4 年之前
父節點
當前提交
075e492643

+ 58 - 0
src/main/java/thyyxxk/webserver/controller/reports/IllegalChargesAnalysisController.java

@@ -0,0 +1,58 @@
+package thyyxxk.webserver.controller.reports;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import thyyxxk.webserver.entity.ResultVo;
+import thyyxxk.webserver.entity.dictionary.PureCodeName;
+import thyyxxk.webserver.entity.reports.illegalChargesAnalysis.IllegalChargeData;
+import thyyxxk.webserver.entity.reports.illegalChargesAnalysis.IllegalChargeTemplate;
+import thyyxxk.webserver.entity.reports.illegalChargesAnalysis.SearchChargeItem;
+import thyyxxk.webserver.service.reports.IllegalChargesAnalysisService;
+
+import java.util.List;
+
+/**
+ * @description: 违规收费分析控制器
+ * @author: DingJie
+ * @create: 2021-04-15 16:45:08
+ **/
+@RestController
+@RequestMapping("/illegalChargesAnalysis")
+public class IllegalChargesAnalysisController {
+    private final IllegalChargesAnalysisService service;
+
+    @Autowired
+    public IllegalChargesAnalysisController(IllegalChargesAnalysisService service) {
+        this.service = service;
+    }
+
+    @GetMapping("/fetchMyTemplates")
+    public ResultVo<List<IllegalChargeTemplate>> fetchMyTemplates() {
+        return service.fetchMyTemplates();
+    }
+
+    @PostMapping("/insertNewTemplate")
+    public ResultVo<String> insertNewTemplate(@RequestBody IllegalChargeTemplate template) {
+        return service.insertNewTemplate(template);
+    }
+
+    @PostMapping("/deleteTemplate")
+    public ResultVo<String> deleteTemplate(@RequestBody IllegalChargeTemplate template) {
+        return service.deleteTemplate(template);
+    }
+
+    @PostMapping("/searchChargeItem")
+    public ResultVo<List<PureCodeName>> searchChargeItem(@RequestBody SearchChargeItem param) {
+        return service.searchChargeItem(param);
+    }
+
+    @PostMapping("/saveTemplateChanges")
+    public ResultVo<String> saveTemplateChanges(@RequestBody IllegalChargeTemplate template) {
+        return service.saveTemplateChanges(template);
+    }
+
+    @PostMapping("/analyzeTargetData")
+    public ResultVo<List<IllegalChargeData>> analyzeTargetData(@RequestBody IllegalChargeTemplate template) {
+        return service.analyzeTargetData(template);
+    }
+}

+ 53 - 0
src/main/java/thyyxxk/webserver/dao/his/reports/IllegalChargesAnalysisDao.java

@@ -0,0 +1,53 @@
+package thyyxxk.webserver.dao.his.reports;
+
+
+import org.apache.ibatis.annotations.*;
+import thyyxxk.webserver.entity.dictionary.PureCodeName;
+import thyyxxk.webserver.entity.reports.illegalChargesAnalysis.IllegalChargeData;
+import thyyxxk.webserver.entity.reports.illegalChargesAnalysis.IllegalChargeTemplate;
+
+import java.util.List;
+
+/**
+ * @author dj
+ */
+@Mapper
+public interface IllegalChargesAnalysisDao {
+
+    @Select("select * from t_illegal_charge_template where id like #{code} or id like 'admin%' order by id")
+    List<IllegalChargeTemplate> selectMyTemplates(@Param("code") String code);
+
+    @Select("select 1 from t_illegal_charge_template where id=#{id}")
+    Integer selectCurrentId(@Param("id") String id);
+
+    @Insert("insert into t_illegal_charge_template (id, label, parent, personal) values " +
+            "(#{id}, #{label}, #{parent}, 1)")
+    void insertNewTemplate(IllegalChargeTemplate template);
+
+    @Delete("delete from t_illegal_charge_template where id like #{id}")
+    void deleteTemplate(@Param("id") String id);
+
+    @Select("select rtrim(code) as code, rtrim(name) as name from zd_charge_item where py_code like #{pyCode}")
+    List<PureCodeName> selectChargeItemByPyCode(@Param("pyCode") String pyCode);
+
+    @Select("select rtrim(code) as code, rtrim(name) as name from zd_charge_item where code like #{code}")
+    List<PureCodeName> selectChargeItemByCode(@Param("code") String code);
+
+    @Select("select rtrim(code) as code, rtrim(name) as name from zd_charge_item where name like #{name}")
+    List<PureCodeName> selectChargeItemByName(@Param("name") String name);
+
+    @Update("update t_illegal_charge_template set label=#{label}, value=#{value},attribute=#{attribute} where id=#{id}")
+    void updateTemplate(IllegalChargeTemplate template);
+
+    @Select("select rtrim(inpatient_no) as inpatientNo, " +
+            "admiss_times,detail_sn,charge_date, " +
+            "rtrim(charge_code_mx) as chargeCode, " +
+            "chargeName=(select rtrim(name) from zd_charge_item where code=charge_code_mx), " +
+            "chargeDay=convert(varchar(10),charge_date,21), " +
+            "charge_fee,charge_amount,trans_flag_yb from zy_detail_charge " +
+            "where charge_fee>0 and isnull(trans_flag_yb,0)!=2 and charge_date>=#{start} and " +
+            "charge_date<=#{end} and charge_code_mx=#{code}")
+    List<IllegalChargeData> selectChargeData(@Param("start") String start,
+                                             @Param("end") String end,
+                                             @Param("code") String code);
+}

+ 5 - 4
src/main/java/thyyxxk/webserver/dao/his/xmyp/XmYpDao.java

@@ -203,9 +203,10 @@ public interface XmYpDao {
 
     @Insert("INSERT into zd_charge_item_hnsgs " +
             "select HOSP_CODE,HOSP_NAME,HOSP_MODEL,ITEM_NAME,ITEM_CODE,MATCH_TYPE " +
-            "from (select HOSP_CODE,HOSP_NAME,HOSP_MODEL,ITEM_NAME,ITEM_CODE,MATCH_TYPE, " +
-            "max(AUDIT_DATE) time from insur_szgs.[dbo].BS_CATALOG_MATCH left join " +
-            "insur_szgs.[dbo].mt_hosp_medi on HOSP_CODE=medi_code where len(HOSP_CODE)<7 " +
-            "group by HOSP_CODE,HOSP_NAME,HOSP_MODEL,ITEM_NAME,ITEM_CODE,MATCH_TYPE) a")
+            "from (select HOSP_CODE,max(HOSP_NAME) HOSP_NAME,max(HOSP_MODEL) HOSP_MODEL, " +
+            "max(ITEM_NAME) ITEM_NAME,max(ITEM_CODE) ITEM_CODE,max(MATCH_TYPE) MATCH_TYPE, " +
+            "max(AUDIT_DATE) time from insur_szhngs.[dbo].BS_CATALOG_MATCH  left join " +
+            "insur_szhngs.[dbo].mt_hosp_medi on HOSP_CODE=medi_code where len(HOSP_CODE)<7 " +
+            "group by HOSP_CODE) a")
     void rewriteZdHnsgsItem();
 }

+ 2 - 1
src/main/java/thyyxxk/webserver/dao/his/yibao/PatientDao.java

@@ -236,7 +236,8 @@ public interface PatientDao {
 
 
     @Select("select detail_sn,rtrim(charge_code_mx) as chargeCodeMx,charge_fee from zy_detail_charge " +
-            "where inpatient_no=#{zyh} and admiss_times=#{zycs} and ledger_sn=#{sn} and isnull(trans_flag_yb,0) not in (1,2)")
+            "where inpatient_no=#{zyh} and admiss_times=#{zycs} and ledger_sn=#{sn} " +
+            "and isnull(infant_flag,0)!=1 and isnull(trans_flag_yb,0) not in (1,2)")
     LinkedList<FeeCounteract> selectAllNotUploadedFees(@Param("zyh") String zyh, @Param("zycs") Integer zycs, @Param("sn") Integer sn);
 
     @Update("update zy_detail_charge set trans_flag_yb=2 where inpatient_no=#{zyh} and " +

+ 11 - 0
src/main/java/thyyxxk/webserver/entity/dictionary/PureCodeName.java

@@ -2,8 +2,19 @@ package thyyxxk.webserver.entity.dictionary;
 
 import lombok.Data;
 
+/**
+ * @author dj
+ */
 @Data
 public class PureCodeName {
     private String code;
     private String name;
+
+    public PureCodeName() {
+    }
+
+    public PureCodeName(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
 }

+ 29 - 0
src/main/java/thyyxxk/webserver/entity/reports/illegalChargesAnalysis/IllegalChargeData.java

@@ -0,0 +1,29 @@
+package thyyxxk.webserver.entity.reports.illegalChargesAnalysis;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @description: 违规收费详情
+ * @author: DingJie
+ * @create: 2021-04-16 22:38:42
+ **/
+@Data
+public class IllegalChargeData {
+    private String inpatientNo;
+    private Integer admissTimes;
+    private Integer detailSn;
+    private String chargeCode;
+    private String chargeName;
+    private String chargeDay;
+    private Date chargeDate;
+    private String chargeFee;
+    private String chargeAmount;
+    private Integer conflictDetailSn;
+    private String conflictChargeCode;
+    private String conflictChargeName;
+    private Date conflictChargeDate;
+    private String conflictChargeFee;
+    private String conflictChargeAmount;
+}

+ 88 - 0
src/main/java/thyyxxk/webserver/entity/reports/illegalChargesAnalysis/IllegalChargeTemplate.java

@@ -0,0 +1,88 @@
+package thyyxxk.webserver.entity.reports.illegalChargesAnalysis;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+import thyyxxk.webserver.entity.dictionary.PureCodeName;
+import thyyxxk.webserver.utils.StringUtil;
+
+/**
+ * @author dj
+ */
+@Data
+public class IllegalChargeTemplate implements Serializable {
+
+	private static final long serialVersionUID =  6293651779985385524L;
+
+	/**
+	 * 模板唯一id,主键
+	 */
+	private String id;
+
+	/**
+	 * 模板名称
+	 */
+	private String label;
+
+	/**
+	 * 模板具体内容
+	 */
+	private String value;
+
+	/**
+	 * 父模板id
+	 */
+	private String parent;
+
+	/**
+	 * 是否属于个人模板:0-公共模板,1-个人模板
+	 */
+	private Integer personal;
+
+	/**
+	 * 模板属性:1-同时收费模板
+	 */
+	private String attribute;
+
+	/**
+	 * 项目类型:0-目录,1-项目
+	 * */
+	private Integer type;
+
+	@TableField(exist = false)
+	private List<IllegalChargeTemplate> children = new ArrayList<>();
+
+	@TableField(exist = false)
+	private List<PureCodeName> mainCharges = new ArrayList<>();
+
+	@TableField(exist = false)
+	private List<PureCodeName> conflictCharges = new ArrayList<>();
+
+	@TableField(exist = false)
+	private String start;
+
+	@TableField(exist = false)
+	private String end;
+
+	public void analyzeValue() {
+		if (StringUtil.notBlank(value)) {
+			String[] allCharges = value.split("\\$");
+			setMainCharges(genChargeListFromValue(allCharges[0]));
+			setConflictCharges(genChargeListFromValue(allCharges[1]));
+		}
+	}
+
+	private List<PureCodeName> genChargeListFromValue(String charge) {
+		List<PureCodeName> list = new ArrayList<>();
+		String[] charges = charge.split("#");
+		for (String s : charges) {
+			String[] item = s.split("\\|");
+			PureCodeName codeName = new PureCodeName(item[0], item[1]);
+			list.add(codeName);
+		}
+		return list;
+	}
+}

+ 14 - 0
src/main/java/thyyxxk/webserver/entity/reports/illegalChargesAnalysis/SearchChargeItem.java

@@ -0,0 +1,14 @@
+package thyyxxk.webserver.entity.reports.illegalChargesAnalysis;
+
+import lombok.Data;
+
+/**
+ * @description: 搜索收费项目参数
+ * @author: DingJie
+ * @create: 2021-04-16 17:45:49
+ **/
+@Data
+public class SearchChargeItem {
+    private String method;
+    private String content;
+}

+ 0 - 1
src/main/java/thyyxxk/webserver/service/lisdock/LisDockService.java

@@ -51,7 +51,6 @@ public class LisDockService {
         SIGN[0] = String.valueOf(System.currentTimeMillis());
         String ori = APP_ID + SIGN[0] + SECRET;
         SIGN[1] = Md5Util.encrypt(Md5Util.encrypt(ori));
-        log.info("生成健康证接口时间戳和签名:{}", (Object) SIGN);
     }
 
     @Autowired

+ 182 - 0
src/main/java/thyyxxk/webserver/service/reports/IllegalChargesAnalysisService.java

@@ -0,0 +1,182 @@
+package thyyxxk.webserver.service.reports;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import thyyxxk.webserver.config.exception.ExceptionEnum;
+import thyyxxk.webserver.dao.his.reports.IllegalChargesAnalysisDao;
+import thyyxxk.webserver.entity.ResultVo;
+import thyyxxk.webserver.entity.dictionary.PureCodeName;
+import thyyxxk.webserver.entity.reports.illegalChargesAnalysis.IllegalChargeData;
+import thyyxxk.webserver.entity.reports.illegalChargesAnalysis.IllegalChargeTemplate;
+import thyyxxk.webserver.entity.reports.illegalChargesAnalysis.SearchChargeItem;
+import thyyxxk.webserver.utils.ResultVoUtil;
+import thyyxxk.webserver.utils.StringUtil;
+import thyyxxk.webserver.utils.TokenUtil;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @description: 违规收费项目分析实现类
+ * @author: DingJie
+ * @create: 2021-04-15 16:47:34
+ **/
+@Slf4j
+@Service
+public class IllegalChargesAnalysisService {
+    private final IllegalChargesAnalysisDao dao;
+    private static final String DASH = "_";
+    private static final String ADMIN = "admin";
+    private static final String ADMIN_2 = "admin_2";
+
+    @Autowired
+    public IllegalChargesAnalysisService(IllegalChargesAnalysisDao dao) {
+        this.dao = dao;
+    }
+
+    public ResultVo<List<IllegalChargeTemplate>> fetchMyTemplates() {
+        String code = TokenUtil.getTokenUserId() + "%";
+        List<IllegalChargeTemplate> tempList = dao.selectMyTemplates(code);
+        List<IllegalChargeTemplate> resultList = new ArrayList<>();
+        Map<String ,IllegalChargeTemplate> treeMap = new HashMap<>(tempList.size());
+        for (IllegalChargeTemplate item : tempList) {
+            item.analyzeValue();
+            treeMap.put(item.getId(), item);
+            if (null == item.getParent()) {
+                resultList.add(item);
+            }
+        }
+        for (IllegalChargeTemplate item : tempList) {
+            IllegalChargeTemplate template = treeMap.get(item.getParent());
+            if (null != template) {
+                if (null == template.getChildren()) {
+                    template.setChildren(new ArrayList<>());
+                }
+                template.getChildren().add(item);
+            }
+        }
+        return ResultVoUtil.success(resultList);
+    }
+
+    public ResultVo<String> insertNewTemplate(IllegalChargeTemplate template) {
+        if (StringUtil.isBlank(template.getLabel())) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "模板名称不能为空!");
+        }
+        if (template.getPersonal() == 0) {
+            dao.insertNewTemplate(template);
+            return ResultVoUtil.success("创建成功。");
+        }
+        StringBuilder id = new StringBuilder(template.getId());
+        if (!id.toString().contains(DASH)) {
+            template.setId(TokenUtil.getTokenUserId() + DASH + id);
+        } else {
+            if (id.toString().startsWith(ADMIN)) {
+                id = new StringBuilder(id.toString().replace(ADMIN, TokenUtil.getTokenUserId()));
+                template.setId(id.toString());
+            }
+        }
+        if (template.getParent().startsWith(ADMIN) && !template.getParent().equals(ADMIN_2)) {
+            template.setParent(template.getParent().replace("admin", TokenUtil.getTokenUserId()));
+        }
+        id = new StringBuilder(template.getId());
+        String[] idArr = id.toString().split("-");
+        String lastBit = idArr[idArr.length - 1];
+        int position = Integer.parseInt(lastBit);
+        Integer exist = dao.selectCurrentId(id.toString());
+        while (exist != null) {
+            position++;
+            idArr[idArr.length - 1] = String.valueOf(position);
+            id = new StringBuilder();
+            for (int i = 0; i < idArr.length - 1; i++) {
+                id.append(idArr[i]).append("-");
+            }
+            id.append(position);
+            exist = dao.selectCurrentId(id.toString());
+        }
+        template.setId(id.toString());
+        dao.insertNewTemplate(template);
+        return ResultVoUtil.success("创建成功。");
+    }
+
+    public ResultVo<String> deleteTemplate(IllegalChargeTemplate template) {
+        String id = template.getId() + "%";
+        dao.deleteTemplate(id);
+        return ResultVoUtil.success("删除成功。");
+    }
+
+    public ResultVo<List<PureCodeName>> searchChargeItem(SearchChargeItem param) {
+        String pyCode = "%" + param.getContent().toUpperCase() + "%";
+        switch (param.getMethod()) {
+            case "alpha":
+                return ResultVoUtil.success(dao.selectChargeItemByPyCode(pyCode));
+            case "code":
+                return ResultVoUtil.success(dao.selectChargeItemByCode(pyCode));
+            case "name":
+                return ResultVoUtil.success(dao.selectChargeItemByName(pyCode));
+            default:
+                return ResultVoUtil.success(new ArrayList<>());
+        }
+    }
+
+    public ResultVo<String> saveTemplateChanges(IllegalChargeTemplate template) {
+        if (null == template.getMainCharges() || template.getMainCharges().isEmpty()) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "收费主体不能为空!");
+        }
+        if (null == template.getConflictCharges() || template.getConflictCharges().isEmpty()) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "冲突收费不能为空!");
+        }
+        String value = genTemplateValue(template.getMainCharges()).append("$")
+                .append(genTemplateValue(template.getConflictCharges())).toString();
+        template.setValue(value);
+        dao.updateTemplate(template);
+        return ResultVoUtil.success();
+    }
+
+    private StringBuilder genTemplateValue(List<PureCodeName> charges) {
+        StringBuilder builder = new StringBuilder();
+        for (int i = 0;  i < charges.size(); i ++) {
+            PureCodeName charge = charges.get(i);
+            builder.append(charge.getCode()).append("|").append(charge.getName());
+            if (i < charges.size() - 1) {
+                builder.append("#");
+            }
+        }
+        return builder;
+    }
+
+    public ResultVo<List<IllegalChargeData>> analyzeTargetData(IllegalChargeTemplate template) {
+        String start = template.getStart() + " 00:00:00";
+        String end = template.getEnd() + " 23:59:59";
+        List<IllegalChargeData> mainList = new ArrayList<>();
+        for (PureCodeName mainCharge : template.getMainCharges()) {
+            mainList.addAll(dao.selectChargeData(start, end, mainCharge.getCode()));
+        }
+        List<IllegalChargeData> conflictList = new ArrayList<>();
+        for (PureCodeName conflictCharge : template.getConflictCharges()) {
+            conflictList.addAll(dao.selectChargeData(start, end, conflictCharge.getCode()));
+        }
+        Map<String, IllegalChargeData> map = new HashMap<>(mainList.size());
+        for (IllegalChargeData item : mainList) {
+            String key = item.getInpatientNo() + "_" + item.getChargeDay();
+            map.put(key, item);
+        }
+        List<IllegalChargeData> resultList = new ArrayList<>();
+        for (IllegalChargeData item : conflictList) {
+            String key = item.getInpatientNo() + "_" + item.getChargeDay();
+            if (map.containsKey(key)) {
+                IllegalChargeData data = map.get(key);
+                data.setConflictChargeCode(item.getChargeCode());
+                data.setConflictChargeAmount(item.getChargeAmount());
+                data.setConflictChargeDate(item.getChargeDate());
+                data.setConflictChargeFee(item.getChargeFee());
+                data.setConflictChargeName(item.getChargeName());
+                data.setConflictDetailSn(item.getDetailSn());
+                resultList.add(data);
+            }
+        }
+        return ResultVoUtil.success(resultList);
+    }
+}