From 65314b14210a175bae095649584614973b3619df Mon Sep 17 00:00:00 2001 From: liusheng <337615773@qq.com> Date: 星期二, 12 八月 2025 13:48:14 +0800 Subject: [PATCH] 代码提交 --- ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFundServiceImpl.java | 737 ++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 632 insertions(+), 105 deletions(-) diff --git a/ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFundServiceImpl.java b/ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFundServiceImpl.java index 37b6adb..2e80ce8 100644 --- a/ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFundServiceImpl.java +++ b/ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFundServiceImpl.java @@ -7,34 +7,44 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.HttpStatus; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.HttpClientKit; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.bean.DtoConversionUtils; import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.project.domain.*; import com.ruoyi.project.domain.vo.*; import com.ruoyi.project.mapper.*; import com.ruoyi.project.service.*; +import com.ruoyi.system.mapper.SysUserMapper; +import com.ruoyi.system.mapper.SysUserRoleMapper; +import com.ruoyi.system.service.ISysUserService; +import com.taobao.api.ApiException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; -import org.apache.ibatis.annotations.Param; import org.apache.poi.ss.usermodel.*; -import org.apache.poi.xssf.usermodel.XSSFColor; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.RequestBody; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.math.BigDecimal; +import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; /** @@ -50,6 +60,21 @@ ServiceFundMapper serviceFundMapper; @Autowired + private DingTalkService dingTalkService; + + @Autowired + private IServiceFundflowruleService serviceFundflowruleService; + + @Autowired + private IServiceFundflowService serviceFundflowService; + + @Autowired + private SysUserRoleMapper sysUserRoleMapper; + + @Autowired + SysUserMapper sysUserMapper; + + @Autowired ServiceFunddetailMapper serviceFunddetailMapper; @Autowired @@ -57,6 +82,21 @@ @Autowired ServiceReimbursementMapper serviceReimbursementMapper; + + @Autowired + ServiceReimbursementSharedMapper serviceReimbursementSharedMapper; + + @Autowired + private IServiceFundflowService fundflowService; + + @Autowired + private ISysUserService sysUserService; + + @Autowired + private IServiceSystemmessageService iServiceSystemmessageService; + + @Autowired + IServiceReimbursementService iServiceReimbursementService; @Autowired IServiceFundSharedService sharedService; @@ -77,8 +117,151 @@ private VExpertfeeExpertMapper vExpertfeeExpertMapper; @Autowired + private VExpertfeeDonorMapper vExpertfeeDonorMapper; + + @Autowired private VExpertfeeTotalMapper vExpertfeeTotalMapper; + @Value("${xyurl}") + private String xyurl; + + @Value("${rexyurl}") + private String rexyurl; + + @Value("${newSwitch}") + private Integer newSwitch; + + @Value("${spring.profiles.active}") + private String active; + + /** + * 鑷磋繙绯荤粺娴佺▼閫�鍥� + * + * @param serviceProcessVO + * @return + */ + @Override + public Boolean backDocument(ServiceProcessDocVO serviceProcessVO) { + String applytype = serviceProcessVO.getApplytype(); + + if (applytype.equals("0")) { + //宸梾鎶ラ攢閫�鍥� + ServiceReimbursement serviceReimbursement = new ServiceReimbursement(); + serviceReimbursement.setId(serviceProcessVO.getBackCode()); + List<ServiceReimbursement> serviceReimbursementList = iServiceReimbursementService.queryList(serviceReimbursement); + ServiceReimbursement serviceReimbursement1 = serviceReimbursementList.get(0); + serviceReimbursement1.setFlowlevel(100L); + serviceReimbursement1.setDelFlag(0); + serviceReimbursement1.setUploadStates(0); + serviceReimbursement1.setBackflowlevel(199L); + serviceReimbursement1.setRecordstatus(-1); + iServiceReimbursementService.updateById(serviceReimbursement1); + + //鍒犻櫎share鏁版嵁 + serviceReimbursementSharedMapper.delResharedInfoByReimid(serviceReimbursement1.getId()); + + } else { + //璐圭敤鐢宠閫�鍥� + ServiceFund serviceFund = new ServiceFund(); + serviceFund.setId(serviceProcessVO.getBackCode()); + List<ServiceFund> serviceFunds = queryInfoById(serviceFund); + ServiceFund serviceFund1 = serviceFunds.get(0); + serviceFund1.setFlowlevel(100L); + serviceFund1.setDel_flag(0); + serviceFund1.setRecordstatus(-1); + serviceFund1.setBackflowlevel(199); + updateById(serviceFund1); + + //鍒犻櫎share鏁版嵁 + serviceFundSharedMapper.delfundsharedInfoById(null, serviceFund1.getId()); + + //杩欎釜娑堟伅鍙戦�侊紝灏变笉鍦ㄨ繖鍋氫簡锛屽湪瀹℃壒璁板綍鐨勬帴鍙i噷鍋氾紙鍗虫棩蹇楁帴鍙o級 + //sendMeg(serviceFund1.getApplytype(), sysUser.getPhonenumber()); + } + + return true; + } + + /** + * 娴佺▼瀹℃壒鏃ュ織 + * + * @param serviceProcessVO + * @return + */ + @Override + public Boolean processlog(ServiceProcessVO serviceProcessVO) { + + String userNo = null; + String userName = null; + String phone = null; + String applytype = null; + Long flowlevel = null; + if (serviceProcessVO.getApplytype().equals("0")) { + ServiceReimbursement serviceReimbursement = new ServiceReimbursement(); + serviceReimbursement.setId(serviceProcessVO.getBackCode()); + List<ServiceReimbursement> serviceReimbursementList = iServiceReimbursementService.queryList(serviceReimbursement); + if (CollectionUtils.isEmpty(serviceReimbursementList)) { + log.error("serviceReimbursementList娌℃湁鏌ュ埌鏁版嵁锛歿}", serviceProcessVO.getBackCode()); + return false; + } + //杩欏嚑涓�硷紝闇�瑕佺粰涓嬮潰鐢�; applytype锛屼笉鑳界敤浼犺繘鏉ョ殑锛屽彧鑳借嚜宸辨煡 + userNo = serviceReimbursementList.get(0).getUserno(); + userName = serviceReimbursementList.get(0).getUsername(); + phone = serviceReimbursementList.get(0).getPhone(); + flowlevel = serviceReimbursementList.get(0).getFlowlevel(); + applytype = "0"; + } else { + ServiceFund serviceFund = new ServiceFund(); + serviceFund.setId(serviceProcessVO.getBackCode()); + List<ServiceFund> serviceFunds = queryInfoById(serviceFund); + if (CollectionUtils.isEmpty(serviceFunds)) { + log.error("serviceFunds娌℃湁鏌ュ埌鏁版嵁锛歿}", serviceProcessVO.getBackCode()); + return false; + } + userNo = serviceFunds.get(0).getUserno(); + userName = serviceFunds.get(0).getUsername(); + phone = serviceFunds.get(0).getPhone(); + flowlevel = serviceFunds.get(0).getFlowlevel(); + applytype = serviceFunds.get(0).getApplytype(); + } + + //灏嗘搷浣滀繚瀛樺埌fundflow琛ㄤ腑 + ServiceFundflow serviceFundflow = new ServiceFundflow(); + serviceFundflow.setCreateBy("admin"); + serviceFundflow.setCreateTime(new Date()); + serviceFundflow.setUpdateBy("admin"); + serviceFundflow.setUpdateTime(new Date()); + serviceFundflow.setCheckusername(serviceProcessVO.getCheckusername()); + serviceFundflow.setFlowcontent(serviceProcessVO.getFlowcontent()); + serviceFundflow.setFlowconclusion(1); + serviceFundflow.setFundtype(2); + serviceFundflow.setFlowlevel(flowlevel.intValue()); + if (serviceProcessVO.getFlowconclusion() == 3) serviceFundflow.setFlowlevel(999); + serviceFundflow.setApplytype(applytype); + serviceFundflow.setFundid(serviceProcessVO.getBackCode()); + serviceFundflow.setCheckTime(serviceProcessVO.getCheckTime()); + fundflowService.save(serviceFundflow); + + + SysUser sysUser = sysUserService.selectUserByUserName(userNo); + sendMeg(serviceProcessVO, phone); + //鍙戦�佷俊鎭繚瀛� + ServiceSystemmessage serviceSystemmessage = new ServiceSystemmessage(); + serviceSystemmessage.setFundtype(1); + serviceSystemmessage.setSenduserno(sysUser.getUserName()); + serviceSystemmessage.setSendusername(sysUser.getNickName()); + serviceSystemmessage.setReceiveuserno(userNo); + serviceSystemmessage.setReceiveusername(userName); + serviceSystemmessage.setUpdateTime(new Date()); + serviceSystemmessage.setUpdateBy(sysUser.getNickName()); + serviceSystemmessage.setIsread(0); + serviceSystemmessage.setMessagetype(1); + serviceSystemmessage.setMessagetitle("璐㈠姟绯荤粺淇℃伅"); + serviceSystemmessage.setMessagecontent(serviceProcessVO.getFlowcontent()); + iServiceSystemmessageService.save(serviceSystemmessage); + + return true; + } /** * 鏌ヨ璐圭敤鐢宠涓诲垪琛�(鍖呭惈鍒犻櫎鐨�) @@ -128,6 +311,8 @@ if (serviceFund.getJxrq() != null) { wrappers.eq(ServiceFund::getJxrq, serviceFund.getJxrq()); } + // 娣诲姞 group by donorname +// wrappers.groupBy(ServiceFund::getDonorname); return this.list(wrappers); } @@ -148,6 +333,392 @@ return serviceFundMapper.getInfoByInfoId(infoid); } + @Override + public Map<String, String> checkFund(CheckFundVO checkFundVO, LoginUser loginUser) { + ServiceFund serviceFund = getById(checkFundVO.getFundid()); + Map<String, String> map = new HashMap<>(); + + if (serviceFund == null) { + map.put(HttpStatus.NO_CONTENT + "", "璐圭敤缂栧彿涓嶆纭�"); + return map; + } + + Integer TotalLevel = 0; + ServiceFundflowrule serviceFundflowrule = new ServiceFundflowrule(); + serviceFundflowrule.setFundtype(2); + serviceFundflowrule.setApplytype(serviceFund.getApplytype()); + serviceFundflowrule.setCheckuserno(loginUser.getUsername()); + log.info("serviceFundController---checkFund---queryList鐨勫叆鍙傚�約erviceFundflowrule:{}", serviceFundflowrule); + List<ServiceFundflowrule> serviceFundflowrules = serviceFundflowruleService.queryList(serviceFundflowrule); + + if (serviceFundflowrules == null || serviceFundflowrules.stream().count() == 0) { + map.put(HttpStatus.ERROR + "", "褰撳墠浜哄憳鏃犳璁板綍瀹℃牳鏉冮檺"); + return map; + } + + if (serviceFundflowrules.get(0).getFlowlevel() - 1 != serviceFund.getFlowlevel()) { + map.put(HttpStatus.ERROR + "", "褰撳墠浜哄憳涓庢璁板綍鐨勫鏍哥骇鍒笉绗�"); + return map; + } + + if (serviceFundflowrules != null && serviceFundflowrules.stream().count() > 0) { + TotalLevel = serviceFundflowrules.get(0).getTotallevel(); + } + + Integer CheckFlag = 0; + Integer RecordStatus = serviceFund.getRecordstatus(); + Integer FlowLevel = serviceFund.getFlowlevel().intValue(); + Integer OriginalFlowLevel = FlowLevel; + if (checkFundVO.getFlowconclusion() == 1) { + CheckFlag = 1; + if (TotalLevel == 0) { + RecordStatus = 99; + } else { + if (TotalLevel == FlowLevel + 1) { + RecordStatus = 99; + } else { + RecordStatus = (FlowLevel + 1) * 2; + } + } + FlowLevel = FlowLevel + 1; + SysUser user = loginUser.getUser(); + if (serviceFund.getFlowlevel() == Long.valueOf(serviceFundflowrules.get(0).getFlowlevel() - 1) && serviceFund.getBackflowlevel() == 100) { + log.info("璐㈠姟閫�鍥炲啀鎻愪氦锛屽嚭绾冲啀娆″鎵癸紝涔嬪悗鎻愪氦鍒拌储鍔�"); + serviceFund.setFinancechecher("瀹℃壒浜猴細" + user.getUserName() + " & 瀹℃壒鏃堕棿" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + " & 瀹℃壒缁撴灉锛氶�氳繃"); + + serviceFund.setFlowlevel(serviceFundflowrules.get(0).getTotallevel().longValue()); + serviceFund.setRecordstatus(99); + serviceFund.setUploadStates(1); + updateById(serviceFund); + + //鏁版嵁鍙戦�� + Boolean aBoolean1 = null; + if (newSwitch == 1) { + aBoolean1 = sendData(serviceFund); + if (!aBoolean1) { + map.put("500", "鍙戦�佸け璐�"); + return map; + } + } + //淇濆瓨瀹℃壒娴佺▼琛� + ServiceFundflow serviceFundflow = new ServiceFundflow(); + serviceFundflow.setFundid(serviceFund.getId()); + serviceFundflow.setCheckuserno(user.getUserName()); + serviceFundflow.setCheckusername(user.getNickName()); + serviceFundflow.setFundtype(2); + serviceFundflow.setApplytype(serviceFund.getApplytype()); + serviceFundflow.setFlowconclusion(CheckFlag); + serviceFundflow.setFlowcontent("閫氳繃"); + Boolean aBoolean = serviceFundflowService.saveData(serviceFundflow); + map.put("200", "success"); + return map; + } + //濡傛灉褰撳墠鐧婚檰鏄储鍔★紝鍒欒繘琛岃褰� + List<Integer> roleIds = sysUserRoleMapper.getUserRoleByUserId(user.getUserId()); + if (roleIds != null && roleIds.contains(11)) { + //11涓鸿储鍔� + serviceFund.setFinancechecher("瀹℃壒浜猴細" + user.getUserName() + " & 瀹℃壒鏃堕棿" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " & 瀹℃壒缁撴灉锛氶�氳繃"); + } + + //璁板綍涓�涓嬶紝涓嬩竴绾х殑瀹℃壒锛屼互渚夸簬涓嬩竴绾ч��鍥炲悗锛屽彂璧疯�呮彁浜ゆ椂锛岃兘鍐嶆彁鍒板綋鍓嶅鎵瑰眰绾� + serviceFund.setBackflowlevel(FlowLevel); + } else { + CheckFlag = 2; + if (CheckFlag == 2) { + //搴斿尰闄㈣姹傚鏋滃嚭鐜伴��鍥烇紝鐩存帴閫�鍒板彂璧疯�� + FlowLevel = 0; + RecordStatus = -1; + log.info("serviceFund杩涙潵浜嗗悧锛燂紵锛燂紵锛燂紵 :{},{}", RecordStatus, FlowLevel); + System.out.println("serviceFund杩涙潵浜嗗悧锛燂紵锛燂紵锛燂紵"); + } else { + RecordStatus = (FlowLevel + 1) * 2 - 1; + FlowLevel = (FlowLevel - 1); + if (FlowLevel < 0) { + FlowLevel = 0; + } + } + + SysUser sysUser = sysUserService.selectUserByUserName(serviceFund.getUserno()); + ArrayList<ConcurrentHashMap<String, Object>> contentList = new ArrayList<>(); + ConcurrentHashMap cmap = new ConcurrentHashMap(); + cmap.put("瀹℃壒浜猴細", loginUser.getUser().getUserName()); + cmap.put("瀹℃壒鏃堕棿锛�", new Date()); + cmap.put("鎰忚锛�", "涓嶉�氳繃"); + if (StringUtils.isNotBlank(checkFundVO.getFlowcontent())) cmap.put("鎰忚锛�", checkFundVO.getFlowcontent()); + contentList.add(cmap); + DingTalkReqVo dingTalkReqVo = new DingTalkReqVo(); + dingTalkReqVo.setTitle("璐㈠姟绯荤粺椹冲洖淇℃伅"); + dingTalkReqVo.setNumber(sysUser.getPhonenumber()); + dingTalkReqVo.setContents(contentList); + dingTalkService.sendNotification(dingTalkReqVo); + } + + serviceFund.setRecordstatus(RecordStatus); + serviceFund.setFlowlevel(FlowLevel.longValue()); + // serviceFund.setBackflowlevel(serviceFund.getFlowlevel()); + + ServiceFundflow serviceFundflow = new ServiceFundflow(); + SysUser user = loginUser.getUser(); + serviceFundflow.setFundid(serviceFund.getId()); + serviceFundflow.setCheckuserno(user.getUserName()); + serviceFundflow.setCheckusername(user.getNickName()); + serviceFundflow.setFundtype(2); + serviceFundflow.setApplytype(serviceFund.getApplytype()); + serviceFundflow.setFlowconclusion(CheckFlag); + if (StringUtils.isNotBlank(checkFundVO.getFlowcontent())) { + serviceFundflow.setFlowcontent(checkFundVO.getFlowcontent()); + } else { + serviceFundflow.setFlowcontent(checkFundVO.getFlowconclusion() == 1 ? "閫氳繃" : "涓嶉�氳繃"); + } + serviceFundflow.setFlowlevel(OriginalFlowLevel + 1); + + Boolean aBoolean = serviceFundflowService.saveData(serviceFundflow); + log.info("sserviceFund淇濆瓨鐨勭殑鍊兼槸-------- :{}", aBoolean); + + //053瀹℃壒閫氳繃涔嬪悗锛屽氨闇�瑕佹妸鈥滃姙鍏涓讳换鈥濈殑鍚嶅瓧濉笂 + if (checkFundVO.getFlowconclusion() == 1 && user.getUserName().equals("053")) { + serviceFund.setOfficedirector(user.getNickName()); + serviceFund.setUploadStates(1); + //鏁版嵁鍙戦�� + Boolean aBoolean1 = null; + if (newSwitch == 1) { + //鎼炰竴涓紑鍏筹紝鍒奖鍝嶈�佹祦绋� + aBoolean1 = sendData(serviceFund); + if (!aBoolean1) { + map.put("500", "鍙戦�佸け璐�"); + return map; + } + } + } + System.out.println("serviceFund鐨勫�兼槸--------:" + serviceFund); + log.info("寮�濮嬫洿鏂扮殑鐨勫�兼槸--------"); + + Boolean aBoolean1 = updateById(serviceFund); + log.info("integer鏇存柊鐨勭殑鍊兼槸-------- :{}", aBoolean1); + ServiceSystemmessage serviceSystemmessage = new ServiceSystemmessage(); + serviceSystemmessage.setFundtype(2); + serviceSystemmessage.setApplytype(serviceFund.getApplytype()); + serviceSystemmessage.setSenduserno(user.getUserName()); + serviceSystemmessage.setSendusername(user.getNickName()); + serviceSystemmessage.setReceiveuserno(serviceFund.getUserno()); + serviceSystemmessage.setReceiveusername(serviceFund.getUsername()); + serviceSystemmessage.setUpdateTime(new Date()); + serviceSystemmessage.setUpdateBy(user.getNickName()); + serviceSystemmessage.setIsread(0); + serviceSystemmessage.setMessagetype(1); + serviceSystemmessage.setRelevantno(serviceFund.getId()); + + if (CheckFlag == 1) { + //閫氳繃 + if (serviceFund.getApplytype().equals("1")) { + serviceSystemmessage.setMessagetitle("" + (OriginalFlowLevel + 1) + "绾у鏍搁�氳繃"); + serviceSystemmessage.setMessagecontent("鎮�" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(serviceFund.getCreateTime()) + "鎻愪氦鐨勪笓瀹跺姵鍔¤垂鎹愮尞妗堜緥銆�" + serviceFund.getDonorname() + "銆戠殑璐圭敤鐢宠宸查�氳繃"); + } else if (serviceFund.getApplytype().equals("2")) { + serviceSystemmessage.setMessagetitle("" + (OriginalFlowLevel + 1) + "绾у鏍搁�氳繃"); + serviceSystemmessage.setMessagecontent("鎮�" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(serviceFund.getCreateTime()) + "鎻愪氦鐨勪鸡鐞嗕笓瀹跺姵鍔¤垂鎹愮尞妗堜緥銆�" + serviceFund.getDonorname() + "銆戠殑璐圭敤鐢宠宸查�氳繃"); + } else if (serviceFund.getApplytype().equals("3")) { + serviceSystemmessage.setMessagetitle("" + (OriginalFlowLevel + 1) + "绾у鏍搁�氳繃"); + serviceSystemmessage.setMessagecontent("鎮�" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(serviceFund.getCreateTime()) + "鎻愪氦鐨勫尰瀛︽垚鏈崘鐚渚嬨��" + serviceFund.getDonorname() + "銆戠殑璐圭敤鐢宠宸查�氳繃"); + } else if (serviceFund.getApplytype().equals("4")) { + serviceSystemmessage.setMessagetitle("" + (OriginalFlowLevel + 1) + "绾у鏍搁�氳繃"); + serviceSystemmessage.setMessagecontent("鎮�" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(serviceFund.getCreateTime()) + "鎻愪氦鐨勫姙鍏垂鐢ㄧ敵璇峰凡閫氳繃"); + } else if (serviceFund.getApplytype().equals("5")) { + serviceSystemmessage.setMessagetitle("" + (OriginalFlowLevel + 1) + "绾у鏍搁�氳繃"); + serviceSystemmessage.setMessagecontent("鎮�" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(serviceFund.getCreateTime()) + "鎻愪氦鐨勭哗鏁堢敵璇峰凡閫氳繃"); + } + } else { + //椹冲洖 + if (serviceFund.getApplytype().equals("1")) { + serviceSystemmessage.setMessagetitle("" + (OriginalFlowLevel + 1) + "绾у鏍搁┏鍥�"); + serviceSystemmessage.setMessagecontent("鎮�" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(serviceFund.getCreateTime()) + "鎻愪氦鐨勪笓瀹跺姵鍔¤垂鎹愮尞妗堜緥銆�" + serviceFund.getDonorname() + "銆戠殑璐圭敤鐢宠宸茶椹冲洖锛屽師鍥�: " + checkFundVO.getFlowcontent() + ""); + } else if (serviceFund.getApplytype().equals("2")) { + serviceSystemmessage.setMessagetitle("" + (OriginalFlowLevel + 1) + "绾у鏍搁┏鍥�"); + serviceSystemmessage.setMessagecontent("鎮�" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(serviceFund.getCreateTime()) + "鎻愪氦鐨勪鸡鐞嗕笓瀹跺姵鍔¤垂鎹愮尞妗堜緥銆�" + serviceFund.getDonorname() + "銆戠殑璐圭敤鐢宠宸茶椹冲洖锛屽師鍥�: " + checkFundVO.getFlowcontent() + ""); + } else if (serviceFund.getApplytype().equals("3")) { + serviceSystemmessage.setMessagetitle("" + (OriginalFlowLevel + 1) + "绾у鏍搁┏鍥�"); + serviceSystemmessage.setMessagecontent("鎮�" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(serviceFund.getCreateTime()) + "鎻愪氦鐨勫尰瀛︽垚鏈崘鐚渚嬨��" + serviceFund.getDonorname() + "銆戠殑璐圭敤鐢宠宸茶椹冲洖锛屽師鍥�: " + checkFundVO.getFlowcontent() + ""); + } else if (serviceFund.getApplytype().equals("4")) { + serviceSystemmessage.setMessagetitle("" + (OriginalFlowLevel + 1) + "绾у鏍搁┏鍥�"); + serviceSystemmessage.setMessagecontent("鎮�" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(serviceFund.getCreateTime()) + "鎻愪氦鐨勫姙鍏垂鐢ㄧ敵璇峰凡椹冲洖锛屽師鍥�: " + checkFundVO.getFlowcontent() + ""); + } else if (serviceFund.getApplytype().equals("5")) { + serviceSystemmessage.setMessagetitle("" + (OriginalFlowLevel + 1) + "绾у鏍搁┏鍥�"); + serviceSystemmessage.setMessagecontent("鎮�" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(serviceFund.getCreateTime()) + "鎻愪氦鐨勭哗鏁堢敵璇峰凡椹冲洖锛屽師鍥�: " + checkFundVO.getFlowcontent() + ""); + } + } + iServiceSystemmessageService.save(serviceSystemmessage); + map.put("200", "success"); + return map; + + + } + + public Boolean sendData(ServiceFund serviceFund) { + // fund鍜宖unddetail鐨勬暟鎹幏鍙� + addFundSharedInfo(serviceFund.getId()); + List<ServiceFundShared> fundShareInfos = serviceFundSharedMapper.getFundShareInfoById(serviceFund.getId()); + if (CollectionUtils.isEmpty(fundShareInfos)) return false; + + log.info("fundShareInfos鐨勬暟鎹噺涓猴細{}", fundShareInfos.size()); + ServiceFunddetailShared serviceFunddetailShared = new ServiceFunddetailShared(); + serviceFunddetailShared.setFundid(fundShareInfos.get(0).getId()); + List<ServiceFunddetailShared> serviceFunddetailShareds = detailSharedService.queryList(serviceFunddetailShared); + + // 鏁版嵁鐨勫皝瑁� + Map<String, Object> map = new HashMap<>(); + Map<String, Object> data = new HashMap<>(); + //搴旂敤绫诲瀷 鍥哄畾鍊� + map.put("appName", "collaboration"); + + // 涓昏〃瀛楁鏁版嵁 + Map<String, Object> data2 = new HashMap<>(); + data2.put("formmain_0831", getformmain_0831(fundShareInfos.get(0))); + // 鏄庣粏琛ㄥ瓧娈垫暟鎹紝涓庨檮浠剁殑澶勭悊 + Map<String, List<Map<String, Object>>> map1 = formson_0832(serviceFunddetailShareds); + data2.put("formson_0832", map1.get("formson_0832")); + data2.put("thirdAttachments", map1.get("annexfilesList")); + + data.put("data", data2); + //妯℃澘缂栧彿锛岀敱鑷磋繙鏂规彁渚涳紝璇ュ弬鏁板喅瀹氬彂璧峰崗鍚岀郴缁熶腑鍝釜娴佺▼ + data.put("templateCode", "001"); + //鏄惁涓哄緟鍙戯細0:鏂板缓-鍙戦�侊紱1:鏂板缓-淇濆瓨寰呭彂 + data.put("draft", "0"); + //鍗忓悓鏍囬鍖洪檮浠讹紝Long鍨婰ist锛屽�间负闄勪欢鐨処d銆侷d鏄檮浠舵帴鍙e搷搴旂粨鏋滀腑fileUrl瀛楁鐨勫�� + data.put("attachments", null); + //鍗忓悓鍏枃鐨刬d + data.put("relateDoc", "col|123,456;doc|321,654"); + //鏈缃彇妯℃澘璁剧疆鐨勬爣棰� + data.put("subject", "null"); + + map.put("data", data); + String strRes = null; + if (!active.equals("druid")) { + //濡傛灉鏄湰鍦扮幆澧冿紝灏变笉璋冭繖涓簡 + if (serviceFund.getBackflowlevel() == 100L) { + //鍐嶆鍙戣捣 + strRes = HttpClientKit.postOpr(rexyurl, map.toString()); + } else { + //棣栨鍙戣捣 + strRes = HttpClientKit.postOpr(xyurl, map.toString()); + + } + } + com.alibaba.fastjson2.JSONObject jsonObject = com.alibaba.fastjson2.JSONObject.parseObject(strRes); + String code = jsonObject.getJSONObject("code").toString(); + if (!code.equals("0")) { + return false; + } + + return true; + } + + private Map<String, List<Map<String, Object>>> formson_0832(List<ServiceFunddetailShared> serviceFunddetailSharedList) { + Map<String, List<Map<String, Object>>> allMap = new HashMap<>(); + + List<Map<String, Object>> list = new ArrayList<>(); + List<Map<String, Object>> annexfilesList = new ArrayList<>(); + for (ServiceFunddetailShared serviceFunddetailShared : serviceFunddetailSharedList) { + Map<String, Object> map = new HashMap<>(); + map.put("搴忓彿1", serviceFunddetailShared.getOrderno()); + map.put("璐圭敤椤圭洰", serviceFunddetailShared.getItemname()); + map.put("绋庡墠閲戦", serviceFunddetailShared.getAmount()); + map.put("寮�鎴烽摱琛�", serviceFunddetailShared.getDepositbank()); + map.put("鍗″彿", serviceFunddetailShared.getBankcardno()); + map.put("鏀剁泭浜哄灞炴垨涓撳", serviceFunddetailShared.getBeneficiaryname()); + map.put("绋庡悗閲戦", serviceFunddetailShared.getTaxamount()); + map.put("浣滃簾鏈�缁堥噾棰�", null); + String fpuuid = IdUtils.simpleUUID(); + map.put("鍙戠エ闄勪欢", fpuuid); + map.put("鍙戠エ璇嗗埆", null); + map.put("璇嗗埆浜�", null); + map.put("绋庨", null); + String qtuuid = IdUtils.simpleUUID(); + map.put("鍏朵粬闄勪欢", qtuuid); + map.put("椤圭洰缂栫爜", serviceFunddetailShared.getItemcode()); + map.put("棰勭畻椤圭洰", null); + map.put("璐锋柟绉戠洰", null); + map.put("鍊熸柟鎽樿", null); + map.put("璐锋柟鎽樿", null); + map.put("璇嗗埆澶囨敞", null); + map.put("璐圭敤璇存槑", null); + list.add(map); + + //闄勪欢澶勭悊 + String annexfiles = serviceFunddetailShared.getAnnexfiles(); + String invoicefiles = serviceFunddetailShared.getInvoicefiles(); + + int i = 0; + if (StringUtils.isNotEmpty(annexfiles)) { + List<RbDetailFile> parseArray = JSON.parseArray(annexfiles, RbDetailFile.class); + for (RbDetailFile rbDetailFile : parseArray) { + Map<String, Object> thirdAttachments = new HashMap<>(); + thirdAttachments.put("subReference", qtuuid); + thirdAttachments.put("fileUrl", rbDetailFile.getFileid()); + thirdAttachments.put("sort", i++); + annexfilesList.add(thirdAttachments); + } + } + + if (StringUtils.isNotEmpty(invoicefiles)) { + List<RbDetailFile> parseArray = JSON.parseArray(invoicefiles, RbDetailFile.class); + for (RbDetailFile rbDetailFile : parseArray) { + Map<String, Object> thirdAttachments = new HashMap<>(); + thirdAttachments.put("subReference", fpuuid); + thirdAttachments.put("fileUrl", rbDetailFile.getFileid()); + thirdAttachments.put("sort", i++); + annexfilesList.add(thirdAttachments); + } + } + + } + allMap.put("formson_0832", list); + allMap.put("annexfilesList", annexfilesList); + return allMap; + } + + + private Map<String, Object> getformmain_0831(ServiceFundShared serviceFundShared) { + Map<String, Object> formmain_0831 = new HashMap<>(); + formmain_0831.put("鎹愮尞鑰呭鍚�", serviceFundShared.getDonorname()); + formmain_0831.put("鎶ラ攢浜哄憳", serviceFundShared.getUsername()); + formmain_0831.put("涓氬姟鍖哄煙", serviceFundShared.getDeptmentname()); + formmain_0831.put("缁忔墜浜�", serviceFundShared.getUsername()); + formmain_0831.put("濉〃鏃堕棿", serviceFundShared.getApplyTime()); + formmain_0831.put("鎶ラ攢閲戦鍚堣", serviceFundShared.getPretaxcost()); + formmain_0831.put("涓婁紶闄勪欢", null); + formmain_0831.put("澶囨敞", null); + formmain_0831.put("璐㈠姟瀹℃壒", serviceFundShared.getFinancechecher()); + formmain_0831.put("璐㈠姟閮ㄨ礋璐d汉瀹℃壒", serviceFundShared.getFinancedirector()); + formmain_0831.put("鍔炲叕瀹や富浠诲鎵�", serviceFundShared.getOfficedirector()); + formmain_0831.put("涓氬姟鍓櫌闀垮鎵�", serviceFundShared.getBusvicepresident()); + formmain_0831.put("璐㈠姟鍓櫌闀垮鎵�", serviceFundShared.getFinvicepresident()); + formmain_0831.put("涓績璐熻矗浜哄鎵�", serviceFundShared.getOpochecker()); + formmain_0831.put("鏀粯鏂瑰紡", serviceFundShared.getZffs()); + formmain_0831.put("缁勯暱", null); + formmain_0831.put("瀹℃壒浜哄憳", null); + formmain_0831.put("鏀粯鏃ユ湡", serviceFundShared.getRiqi()); + formmain_0831.put("璇嗗埆浜�-浣滃簾", null); + formmain_0831.put("璐㈠姟瀹℃壒绛惧瓧", serviceFundShared.getFinancedirector()); + formmain_0831.put("璐㈠姟閮ㄨ礋璐d汉绛惧瓧", serviceFundShared.getFinancedirector()); + formmain_0831.put("琛ㄨ揪绫诲瀷", null); + formmain_0831.put("绋庡墠閲戦鍚堣", serviceFundShared.getPretaxcost()); + formmain_0831.put("绋庨鍚堣", serviceFundShared.getPretaxcost() - serviceFundShared.getTaxedcost()); + formmain_0831.put("琛ㄥ崟缂栧彿1", null); + formmain_0831.put("缂栫爜", null); + formmain_0831.put("CIF璐﹀閰嶇疆1", null); + formmain_0831.put(" 闄㈠尯", null); + formmain_0831.put("鏄惁鏀粯", serviceFundShared.getIsdistribute()); + formmain_0831.put("鍑瘉鍙�", null); + formmain_0831.put("閾惰鍥炲崟", null); + formmain_0831.put("OFD", null); + formmain_0831.put("琛ㄥ崟闄勪欢", null); + formmain_0831.put("鐜伴噾娴侀噺鍒嗘瀽", null); + formmain_0831.put("鍑瘉绫诲埆", null); + formmain_0831.put("绋庡悗閲戦鍚堣", serviceFundShared.getTaxedcost()); + formmain_0831.put("鍘嗗彶瀹℃壒璁板綍", null); + formmain_0831.put("琛ㄥ崟缂栧彿", serviceFundShared.getBh()); + formmain_0831.put("鍘嗗彶瀹℃壒鍗曟煡璇�", null); + return formmain_0831; + } @Override public Long getFundId(Long infoid) { @@ -187,9 +758,10 @@ serviceFunddetailShareds.get(i).setId(null); //鏁版嵁鍙戦�佺粰璐㈠姟 try { - uploadOAFileAndUpdateDb(serviceFunddetailShareds.get(i)); + if (!active.equals("druid")) uploadOAFileAndUpdateDb(serviceFunddetailShareds.get(i)); } catch (Exception e) { - log.error("Exception涓叆鍙傜殑ID涓猴細{}", id); + e.printStackTrace(); + log.error("Exception涓叆鍙傜殑ID涓猴細{},寮傚父淇℃伅涓� 锛� {}", id, e.getMessage()); if (id != null) { Boolean aBoolean = sharedService.delfundsharedInfoById(null, id); log.error("fund2鍒嗕韩琛ㄩ噷鐨勬暟鎹槸鍚﹀垹闄ゆ垚鍔燂細{}", aBoolean); @@ -704,7 +1276,8 @@ @Override public List<SpFinancialExpensesFundOut> getExpertfeeList(SpSelectExpertfee spSelectExpertfee) { - return serviceFundMapper.getExpertfeeList(spSelectExpertfee.getPaApplyType(), spSelectExpertfee.getDonorname(), spSelectExpertfee.getPacheckno(), spSelectExpertfee.getCheckstatus(), spSelectExpertfee.getPadepartno(), spSelectExpertfee.getPausername()); + log.info("spSelectExpertfee鐨勫叆鍙備负锛歿}", spSelectExpertfee); + return serviceFundMapper.getExpertfeeList(spSelectExpertfee.getPaApplyType(), spSelectExpertfee.getPfundtaxid(), spSelectExpertfee.getDonorname(), spSelectExpertfee.getPadepartid(), spSelectExpertfee.getPausername()); } @Override @@ -739,7 +1312,7 @@ if (StringUtils.isNotEmpty(serviceFunddetailVO.getIdcardno())) { serviceFunddetailVO.setIdcardno(serviceFunddetailVO.getIdcardno().trim()); } - + log.info("韬唤璇佸彿涓猴細{}", serviceFunddetailVO.getIdcardno()); if (StringUtils.isEmpty(serviceFunddetailVO.getBankcardno())) { throw new BaseException("璇锋鏌ラ摱琛屽崱鍙锋槸鍚︿负绌�,濮撳悕锛�" + serviceFunddetailVO.getBeneficiaryname()); } @@ -929,13 +1502,18 @@ AjaxResult ajaxResult = util.exportExcel(list, "vExpertfeeTotal"); String filePath = RuoYiConfig.getDownloadPath() + ajaxResult.get("msg"); - List<VExpertfeeExpert> list2 = vExpertfeeExpertMapper.selectVExpertfeeExpertListByFaxId(faxId); - ExcelUtil<VExpertfeeExpert> util2 = new ExcelUtil<VExpertfeeExpert>(VExpertfeeExpert.class); - AjaxResult ajaxResult1 = util2.exportExcel(list2, "vExpertfeeExpert"); + List<VExpertfeeDonor> list2 = vExpertfeeDonorMapper.selectVExpertfeeDonorList2(faxId); + ExcelUtil<VExpertfeeDonor> util2 = new ExcelUtil<VExpertfeeDonor>(VExpertfeeDonor.class); + AjaxResult ajaxResult2 = util2.exportExcel(list2, "VExpertfeeDonor"); + + List<VExpertfeeExpert> list3 = vExpertfeeExpertMapper.selectVExpertfeeExpertListByFaxId(faxId); + ExcelUtil<VExpertfeeExpert> util3 = new ExcelUtil<VExpertfeeExpert>(VExpertfeeExpert.class); + AjaxResult ajaxResult3 = util3.exportExcel(list3, "vExpertfeeExpert"); List<String> list1 = new ArrayList<>(); list1.add(ajaxResult.get("msg").toString()); - list1.add(ajaxResult1.get("msg").toString()); + list1.add(ajaxResult2.get("msg").toString()); + list1.add(ajaxResult3.get("msg").toString()); String name = "涓撳璐规眹鎬诲崟" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".xlsx"; @@ -952,9 +1530,7 @@ int uploadOAFileAndUpdateDb(ServiceFunddetailShared remShare) throws Exception { //涓婁紶OA鏂囦欢 - //String strUrl = "http://129.88.242.39:8899/seeyon/rest/token?userName=opo&password=127814f8-84e8-4304-84a5-a71573567efd&loginName=demo3"; String strUrl = "http://129.88.242.39:8899/seeyon/rest/token"; - //String strUrl = "http://slb.hospitalstar.com:8899/seeyon/rest/token"; //涓婁紶鏂囦欢鎴愬姛鍚庯紝鍘绘洿鏂扮浉鍏崇殑鏁版嵁搴� Map<String, Object> map = new HashMap<String, Object>(); map.put("userName", "opo"); @@ -1014,6 +1590,9 @@ log.info("绗笁鏂逛紶鍥炵殑鏁版嵁鑾峰彇鐨刟tts : {}", jsonArr); for (int j = 0; j < jsonArr.size(); j++) { JSONObject jsonRet = jsonArr.getJSONObject(j); + if (StringUtils.isEmpty(jsonRet.get("fileUrl").toString())) { + throw new BaseException("fileID涓虹┖,璇疯仈绯荤涓夋柟澶勭悊"); + } rbDetailFile.setFileid(jsonRet.get("fileUrl").toString()); } @@ -1030,98 +1609,6 @@ } return 0; } - -// int uploadOAFileAndUpdateDb(ServiceFundShared remShare) { -// //涓婁紶OA鏂囦欢 -// //String strUrl = "http://129.88.242.39:8899/seeyon/rest/token?userName=opo&password=127814f8-84e8-4304-84a5-a71573567efd&loginName=demo3"; -// String strUrl = "http://129.88.242.39:8899/seeyon/rest/token"; -// //String strUrl = "http://slb.hospitalstar.com:8899/seeyon/rest/token"; -// //涓婁紶鏂囦欢鎴愬姛鍚庯紝鍘绘洿鏂扮浉鍏崇殑鏁版嵁搴� -// -// -// Map<String, Object> map = new HashMap<String, Object>(); -// map.put("userName", "opo"); -// map.put("password", "4126407a-9821-4874-be41-6568abd6dbe5"); -// map.put("loginName", "demo3"); -// -// JSONObject jsonObj = new JSONObject(map); -// -// System.out.println("uploadOAFileAndUpdateDb + jsonObject" + jsonObj.toString() + "\r\n" + jsonObj.toJSONString()); -// String strRes = HttpClientKit.postOpr(strUrl, jsonObj.toString());// -// //String strRes = HttpClientKit.postMsg(strUrl,jsonObj);//寰楀埌杩斿洖鐨則oken? -// -// JSONObject json1 = JSONObject.parseObject(strRes); -// strRes = json1.get("id").toString(); -// -// ///if(strRes.isEmpty() || "" == strRes) return -1;// 涓虹┖浠h〃澶辫触 -// -// //涓嬮潰闇�姹傝皟鐢ㄦ枃浠剁殑鎺ュ彛锛岃皟鐢ㄦ垚鍔熻繑鍥炲悗锛屽緱鍒癴ilename鍜宖ileid 鐢ㄨ繖浜屼釜鍊煎幓鏇存柊鏁版嵁 -// -// String filePath = RuoYiConfig.getUploadPath(); -// String strMutfileUrl = remShare.getAnnexbankcard();//鍙兘瀛樺湪澶氫釜鍦板潃锛屼互,鍒嗗紑 -// -// String strFUrl = "http://129.88.242.39:8899/seeyon/rest/attachment?token=" + strRes; -// //String strFUrl = "http://slb.hospitalstar.com:8899/seeyon/rest/attachment?token="+strRes; -// //strFUrl = String.format(strFUrl, strRes); -// -// /*File test = null; -// File file = new File("E:\\YYJQ\\OPO\\WEB\\Upload\\upload\\2023\\02\\17"); -// if (file.exists() && file.isDirectory()) { -// // 鑾峰彇鎵�鏈夌洸鐩掓枃浠跺す -// File[] ones = file.listFiles(); -// for (File one : ones) { -// test = one; -// } -// }*/ -// -// String filename = ""; -// String fileid = ""; -// -// String[] urlArray = strMutfileUrl.split(","); -// for (int i = 0; i < urlArray.length; i++) { -// String strOneFileName = urlArray[i]; -// String strTemp = strOneFileName.substring(15); -// String strFile = filePath + strTemp; -// //FileUploadUtils.getAbsoluteFile(filePath,strOneFileName); -// String struploadResult = ""; -// File filetest = new File(strFile); -// try { -// struploadResult = HttpClientKit.sendPostWithFile(filetest, strFUrl); -// } catch (Exception e) { -// e.printStackTrace(); -// } -// -// -// //String strFRes = HttpClientKit.postMsg(strFUrl,jsonFObj); -// if (struploadResult == null) return 0; -// if (struploadResult.isEmpty()) return 0; -// -// JSONObject jsonR = JSONObject.parseObject(struploadResult); -// -// JSONArray jsonArr = jsonR.getJSONArray("atts"); -// for (int j = 0; j < jsonArr.size(); j++) { -// JSONObject jsonRet = jsonArr.getJSONObject(j); -// String name1 = jsonRet.get("filename").toString(); -// String id1 = jsonRet.get("fileUrl").toString(); -// filename += name1; -// fileid += id1; -// if (i != urlArray.length - 1) { -// filename += ","; -// fileid += ","; -// } -// } -// -// } -// -// long nId = remShare.getId(); -// remShare.setId(nId); -// remShare.setFilename(filename); -// remShare.setFileid(fileid); -// boolean bRet = sharedService.updateById(remShare); -// if (!bRet) return -1; -// -// return 0; -// } public long saveFund(ServiceFundVO serviceFundVO) { Long id = null; @@ -1177,6 +1664,46 @@ @Transactional(rollbackFor = Exception.class) public Boolean updateFundTaxIdById(Long id, Long fundTaxId) { - return serviceFundMapper.updateFundTaxIdById(id, fundTaxId); + //灏唂und閲岀殑绠楃◣鏃堕棿锛屼笌璇︽儏閲岀殑鐗堢◣鏃堕棿鍏ㄦ竻绌� + Boolean aBoolean = serviceFundMapper.updateFundTaxIdById(id, fundTaxId); + ServiceFunddetail serviceFunddetail = new ServiceFunddetail(); + serviceFunddetail.setFundid(id); + serviceFunddetail.setTaxTime(null); + serviceFunddetail.setXh(null); + boolean b = serviceFunddetailMapper.updateTaxTime(serviceFunddetail); + return b; + } + + + public void sendMeg(ServiceProcessVO serviceProcessVO, String phone) { + //璁板綍鎿嶄綔璁板綍 + ServiceFundflow serviceFundflow = new ServiceFundflow(); + + serviceFundflow.setCreateBy(serviceProcessVO.getCheckusername()); + serviceFundflow.setUpdateBy(serviceProcessVO.getCheckusername()); + serviceFundflow.setCheckusername(serviceProcessVO.getCheckusername()); + serviceFundflow.setCreateTime(new Date()); + serviceFundflow.setUpdateTime(new Date()); + serviceFundflow.setFlowcontent(serviceProcessVO.getFlowcontent()); + serviceFundflow.setFlowconclusion(serviceProcessVO.getFlowconclusion()); + if (serviceProcessVO.getApplytype() == "0") serviceFundflow.setFundtype(1); + if (serviceProcessVO.getApplytype() == "1") serviceFundflow.setFundtype(2); + serviceFundflow.setFlowlevel(100); + serviceFundflow.setApplytype(serviceProcessVO.getApplytype()); + serviceFundflow.setFundid(serviceProcessVO.getBackCode()); + fundflowService.save(serviceFundflow); + + ArrayList<ConcurrentHashMap<String, Object>> contentList = new ArrayList<>(); + ConcurrentHashMap map = new ConcurrentHashMap(); + map.put("瀹℃壒浜猴細", serviceProcessVO.getCheckusername()); + map.put("瀹℃壒鏃堕棿锛�", serviceProcessVO.getCheckTime()); + map.put("鎰忚锛�", serviceProcessVO.getFlowcontent()); + contentList.add(map); + DingTalkReqVo dingTalkReqVo = new DingTalkReqVo(); + dingTalkReqVo.setTitle("璐㈠姟绯荤粺淇℃伅"); + dingTalkReqVo.setNumber(phone); + dingTalkReqVo.setContents(contentList); + log.info("閽夐拤鍙戦�佹秷鎭�:{}", dingTalkReqVo); + dingTalkService.sendNotification(dingTalkReqVo); } } -- Gitblit v1.9.3