From 7ac1c19249561ef5cc0bf277ef3c683e7515a146 Mon Sep 17 00:00:00 2001 From: CZT <czt18638530771@163.com> Date: 星期四, 10 八月 2023 18:28:45 +0800 Subject: [PATCH] 新增客户单位信息同步 --- src/main/java/com/fzzy/push/impl/ComPushService12.java | 2 src/main/java/com/fzzy/async/fzzy35/impl/Fzzy35Sync1212.java | 110 +++++++++++++++ src/main/java/com/fzzy/async/fzzy40/impl/Fzzy40Sync1212.java | 41 ++--- src/main/java/com/fzzy/async/fzzy35/repository/Fzzy35Sync1212Rep.java | 28 ++++ src/main/java/com/fzzy/api/view/repository/Api1109Rep.java | 6 src/main/java/com/fzzy/async/fzzy35/impl/Fzzy35Sync1201.java | 4 src/main/resources/application-pro.yml | 6 src/main/java/com/fzzy/api/view/repository/Api1212Rep.java | 6 src/main/java/com/fzzy/async/fzzy35/entity/Fz35InoutCustomer.java | 101 ++++++++++++++ src/main/java/com/fzzy/async/fzzy35/Fzzy35SyncService12.java | 58 ++++--- 10 files changed, 300 insertions(+), 62 deletions(-) diff --git a/src/main/java/com/fzzy/api/view/repository/Api1109Rep.java b/src/main/java/com/fzzy/api/view/repository/Api1109Rep.java index e93b925..40f145f 100644 --- a/src/main/java/com/fzzy/api/view/repository/Api1109Rep.java +++ b/src/main/java/com/fzzy/api/view/repository/Api1109Rep.java @@ -1,15 +1,14 @@ package com.fzzy.api.view.repository; import com.fzzy.api.entity.Api1109; -import com.fzzy.api.entity.Api1202; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.transaction.annotation.Transactional; +import java.util.Date; import java.util.List; - public interface Api1109Rep extends JpaRepository<Api1109, String> , JpaSpecificationExecutor<Api1109> { @@ -23,4 +22,7 @@ @Query("from Api1109 where bizId=:bizId ") List<Api1109> getDataByBizId(@Param("bizId") String bizId); + + @Query("from Api1109 where kqdm=:kqdm and zhgxsj >=:start and zhgxsj <:end order by zhgxsj ") + List<Api1109> findPushDataByTime(@Param("kqdm") String kqdm, @Param("start") Date start, @Param("end") Date end); } diff --git a/src/main/java/com/fzzy/api/view/repository/Api1212Rep.java b/src/main/java/com/fzzy/api/view/repository/Api1212Rep.java index 871d4fc..7064e1e 100644 --- a/src/main/java/com/fzzy/api/view/repository/Api1212Rep.java +++ b/src/main/java/com/fzzy/api/view/repository/Api1212Rep.java @@ -17,9 +17,9 @@ @Query("update Api1212 set czbz =:czbz where id=:id") void updateStatus(@Param("id") String id, @Param("czbz") String czbz); - @Query("from Api1212 where id=:id ") - List<Api1212> getDataById(@Param("id") String id); - @Query("from Api1212 where kqdm=:kqdm and zhgxsj >=:start and zhgxsj <:end order by zhgxsj ") List<Api1212> findPushDataByTime(@Param("kqdm") String kqdm, @Param("start") Date start, @Param("end") Date end); + + @Query("from Api1212 where id=:id ") + List<Api1212> getDataById(@Param("id") String id); } diff --git a/src/main/java/com/fzzy/async/fzzy35/Fzzy35SyncService12.java b/src/main/java/com/fzzy/async/fzzy35/Fzzy35SyncService12.java index 15a0549..ca25ac4 100644 --- a/src/main/java/com/fzzy/async/fzzy35/Fzzy35SyncService12.java +++ b/src/main/java/com/fzzy/async/fzzy35/Fzzy35SyncService12.java @@ -35,6 +35,9 @@ private Fzzy35Sync1208 fzzySync1208; @Autowired private Fzzy35Sync1209 fzzySync1209; + @Autowired + private Fzzy35Sync1212 fzzySync1212; + @Override public String getProtocol() { @@ -48,34 +51,35 @@ String deptId = param.getDeptId(); Date start = param.getStart(); Date end = param.getEnd(); + //瀹㈡埛鍗曚綅淇℃伅鍚屾 + fzzySync1212.syncData(kqdm, deptId, start, end); - - //鍚堝悓鍚屾 - fzzySync1201.syncData(kqdm, deptId, start, end); - - //绮鍏ュ簱鍚屾 - fzzySync1202.syncData(kqdm, deptId, start, end); - - //绮鍏ュ簱璐ㄦ鍚屾 - fzzySync1203.syncData(kqdm, deptId, start, end); - - //绮鍏ュ簱缁撶畻鍚屾 - fzzySync1204.syncData(kqdm, deptId, start, end); - - //绮鍑哄簱鍚屾 - fzzySync1205.syncData(kqdm, deptId, start, end); - - //绮鍑哄簱缁撶畻鍚屾 - fzzySync1206.syncData(kqdm, deptId, start, end); - - //绮鎹熸孩鍚屾 - fzzySync1209.syncData(kqdm, deptId, start, end); - - //鏂囦欢淇℃伅鍚屾 - fzzy35Sync1109.syncData(kqdm, deptId, start, end); - - //绮搴撳瓨鍚屾 - fzzySync1208.syncData(kqdm, deptId, start, end); +// //鍚堝悓鍚屾 +// fzzySync1201.syncData(kqdm, deptId, start, end); +// +// //绮鍏ュ簱鍚屾 +// fzzySync1202.syncData(kqdm, deptId, start, end); +// +// //绮鍏ュ簱璐ㄦ鍚屾 +// fzzySync1203.syncData(kqdm, deptId, start, end); +// +// //绮鍏ュ簱缁撶畻鍚屾 +// fzzySync1204.syncData(kqdm, deptId, start, end); +// +// //绮鍑哄簱鍚屾 +// fzzySync1205.syncData(kqdm, deptId, start, end); +// +// //绮鍑哄簱缁撶畻鍚屾 +// fzzySync1206.syncData(kqdm, deptId, start, end); +// +// //绮鎹熸孩鍚屾 +// fzzySync1209.syncData(kqdm, deptId, start, end); +// +// //鏂囦欢淇℃伅鍚屾 +// fzzy35Sync1109.syncData(kqdm, deptId, start, end); +// +// //绮搴撳瓨鍚屾 +// fzzySync1208.syncData(kqdm, deptId, start, end); } } diff --git a/src/main/java/com/fzzy/async/fzzy35/entity/Fz35InoutCustomer.java b/src/main/java/com/fzzy/async/fzzy35/entity/Fz35InoutCustomer.java new file mode 100644 index 0000000..45b07d3 --- /dev/null +++ b/src/main/java/com/fzzy/async/fzzy35/entity/Fz35InoutCustomer.java @@ -0,0 +1,101 @@ +package com.fzzy.async.fzzy35.entity; + +import com.bstek.dorado.annotation.PropertyDef; +import lombok.Data; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import java.io.Serializable; +import java.util.Date; + +/** + * 鍑哄叆搴撳鎴�-寰�鏉ュ崟浣嶄俊鎭� + * + * @author + */ +@Data +@Entity +@Table(name = "D_INOUT_CUSTOMER") +public class Fz35InoutCustomer implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = 1L; + + @Id + @Column(name = "ID_", length = 40) + @PropertyDef(label = "涓婚敭id缂栫爜", description = "绯荤粺鍐呯紪鐮�") + private String id; + + @Column(name = "COMPANY_ID_", length = 10) + @PropertyDef(label = "缁勭粐缂栫爜") + private String companyId; + + @Column(name = "DEPT_ID_", length = 40) + @PropertyDef(label = "鎵�灞炲垎搴�") + private String deptId; + + @Column(name = "TYPE_", length = 4) + @PropertyDef(label = "涓氬姟鍒嗙被", description = "绯荤粺鍐呬娇鐢細鎻愯揣鍟嗐�佷緵璐у晢") + private String type; + + @Column(name = "khlx", length = 50) + @PropertyDef(label = "瀹㈡埛绫诲瀷", description = "1-浼佷笟锛�2-涓汉") + private String khlx; + + @PropertyDef(label = "瀹㈡埛缂栫爜锛氫紒涓氬鎴峰~鍐欑粺涓�绀句細淇$敤浠g爜锛屼釜浜哄鎴峰~鍐欒韩浠借瘉鍙�") + @Column(name = "khbh", length = 18) + private String khbh; + + @Column(name = "NAME_", length = 50) + @PropertyDef(label = "瀹㈡埛鍚嶇О") + private String name; + + @PropertyDef(label = "娉曞畾浠h〃浜�") + @Column(name = "fddbr", length = 64) + private String fddbr; + + @Column(name = "ADDRESS_", length = 200) + @PropertyDef(label = "閫氳鍦板潃") + private String address; + + @PropertyDef(label = "閭斂缂栫爜") + @Column(name = "yzbm", length = 6) + private String yzbm; + + @Column(name = "CONTACT_USER_", length = 50) + @PropertyDef(label = "鑱旂郴浜�") + private String contactUser; + + @Column(name = "PHONE_", length = 20) + @PropertyDef(label = "鑱旂郴鐢佃瘽") + private String phone; + + @Column(name = "CARD_ID_", length = 20) + @PropertyDef(label = "鑱旂郴浜鸿韩浠借瘉鍙�") + private String cardId; + + @PropertyDef(label = "鐢靛瓙淇$") + @Column(name = "dzyx", length = 64) + private String dzyx; + + @Column(name = "BANK_", length = 50) + @PropertyDef(label = "寮�鎴烽摱琛�") + private String bank; + + @Column(name = "BANK_NUM_", length = 30) + @PropertyDef(label = "閾惰璐﹀彿") + private String bankNum; + + @Column(name = "FOOD_AREA_", length = 30) + @PropertyDef(label = "绉嶆闈㈢Н") + private Double foodArea = 0.0; + + @Column(name = "UPDATE_TIME_") + @PropertyDef(label = "鏁版嵁鏇存柊鏃堕棿") + private Date updateTime; + +} diff --git a/src/main/java/com/fzzy/async/fzzy35/impl/Fzzy35Sync1201.java b/src/main/java/com/fzzy/async/fzzy35/impl/Fzzy35Sync1201.java index 3af0978..9a51864 100644 --- a/src/main/java/com/fzzy/async/fzzy35/impl/Fzzy35Sync1201.java +++ b/src/main/java/com/fzzy/async/fzzy35/impl/Fzzy35Sync1201.java @@ -98,8 +98,8 @@ mappingCode = apiTriggerService.getMappingCode(Constant.TRIGGER_P_LSXZ, sysData.getFoodVariety()); apiData.setLsxzdm(mappingCode); - //鍗曚环锛氬厓/鍏枻-->鍏�/鍚� - apiData.setHtdj(sysData.getPrice() == null ? 0.0 : sysData.getPrice()*1000); + //鍗曚环锛氬厓/鍚� + apiData.setHtdj(sysData.getPrice() == null ? 0.0 : sysData.getPrice()); apiData.setYdgxlssl(sysData.getContactAmount() == null ? 0.0 : sysData.getContactAmount()); apiData.setHtzje(new BigDecimal(sysData.getMoney())); diff --git a/src/main/java/com/fzzy/async/fzzy35/impl/Fzzy35Sync1212.java b/src/main/java/com/fzzy/async/fzzy35/impl/Fzzy35Sync1212.java new file mode 100644 index 0000000..1974870 --- /dev/null +++ b/src/main/java/com/fzzy/async/fzzy35/impl/Fzzy35Sync1212.java @@ -0,0 +1,110 @@ +package com.fzzy.async.fzzy35.impl; + +import com.fzzy.api.Constant; +import com.fzzy.api.entity.Api1102; +import com.fzzy.api.entity.Api1212; +import com.fzzy.api.entity.ApiLog; +import com.fzzy.api.utils.ContextUtil; +import com.fzzy.api.view.repository.Api1102Rep; +import com.fzzy.api.view.repository.Api1212Rep; +import com.fzzy.api.view.repository.ApiLogRep; +import com.fzzy.async.fzzy35.entity.Fz35InoutCustomer; +import com.fzzy.async.fzzy35.repository.Fzzy35Sync1212Rep; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import java.util.Date; +import java.util.List; + +/** + * 瀹㈡埛鍗曚綅淇℃伅鏁版嵁鎺ュ彛 + */ +@Slf4j +@Component +public class Fzzy35Sync1212 { + + @Autowired + private Fzzy35Sync1212Rep fzzySync1212Rep; + @Autowired + private Api1212Rep api1212Rep; + @Autowired + private Api1102Rep api1102Rep; + @Autowired + private ApiLogRep apiLogRep; + + + /** + * 鍚屾瀹㈡埛鍗曚綅淇℃伅鎺ュ彛 + * + * @param deptId + * @param start + * @param end + */ + public void syncData(String kqdm, String deptId, Date start, Date end) { + + log.info("-------------1212鎺ュ彛鏁版嵁寮�濮嬪悓姝�------------------"); + + //鍚屾鏁版嵁锛屽彧璁板綍澶辫触鐨勪俊鎭� + ApiLog apiLog = new ApiLog(); + apiLog.setType(ApiLog.TYPE_SYNC); + apiLog.setKqdm(deptId); + apiLog.setUploadTime(new Date()); + apiLog.setInteId(Constant.API_CODE_1201); + apiLog.setStatus(99); + apiLog.setId(ContextUtil.getUUID()); + try { + List<Fz35InoutCustomer> list = fzzySync1212Rep.listInoutCustomer(deptId); + + if (null == list || list.isEmpty()) { + log.debug("-------------娌℃湁鑾峰彇鍒板崟浣嶄俊鎭�------------------"); + return; + } + + //鏍规嵁搴撳尯浠g爜鑾峰彇鍗曚綅浠g爜 + Api1102 api1201 = api1102Rep.findById(kqdm).get(); + + Api1212 apiData; + List<Api1212> api1212List; + for (Fz35InoutCustomer sysData : list) { + + apiData = new Api1212(); + //鍗曚綅浠g爜 + apiData.setId(sysData.getId()); + apiData.setDwdm(api1201.getDwdm()); + apiData.setKqdm(kqdm); + apiData.setKhlx(sysData.getKhlx()); + apiData.setKhtyshxydmhsfzh(sysData.getKhbh()); + apiData.setKhmc(sysData.getName()); + apiData.setFddbr(sysData.getFddbr()); + apiData.setTxdz(StringUtils.isEmpty(sysData.getAddress()) ? "鍗曚綅鍦板潃" :sysData.getAddress()); + apiData.setYzbm(StringUtils.isEmpty(sysData.getYzbm()) ? "" :sysData.getYzbm()); + apiData.setLxrxm(StringUtils.isEmpty(sysData.getContactUser()) ? sysData.getFddbr() :sysData.getContactUser()); + apiData.setLxrdh(StringUtils.isEmpty(sysData.getPhone()) ? "" :sysData.getPhone()); + apiData.setLxrsfzh(StringUtils.isEmpty(sysData.getCardId()) ? "100000000000000000" :sysData.getCardId()); + apiData.setDzyx(StringUtils.isEmpty(sysData.getDzyx()) ? "" :sysData.getDzyx()); +// apiData.setKhfkhh(StringUtils.isEmpty(sysData.getBank()) ? "" :sysData.getBank()); + apiData.setKhfzh(StringUtils.isEmpty(sysData.getBankNum()) ? "" :sysData.getBankNum()); + apiData.setZhgxsj(sysData.getUpdateTime() == null ? new Date() : sysData.getUpdateTime()); + apiData.setBizId(sysData.getId()); + + + api1212List = api1212Rep.getDataById(sysData.getKhbh()); + if(null == api1212List || api1212List.isEmpty()){ + apiData.setCzbz(Constant.CZBZ_I); + }else { + apiData.setCzbz(api1212List.get(0).getCzbz()); + } + + //淇濆瓨鏁版嵁 + api1212Rep.save(apiData); + + log.info("1212---鍚屾鏁版嵁锛歿}", apiData.toString()); + } + } catch (Exception e) { + log.error("---瀹㈡埛鍗曚綅鍚屾鎵ц澶辫触----{}", e); + apiLog.setResult("鍚屾瀹㈡埛鍗曚綅淇℃伅澶辫触锛�" + e.getMessage()); + apiLogRep.save(apiLog); + } + } +} diff --git a/src/main/java/com/fzzy/async/fzzy35/repository/Fzzy35Sync1212Rep.java b/src/main/java/com/fzzy/async/fzzy35/repository/Fzzy35Sync1212Rep.java new file mode 100644 index 0000000..bcdbf43 --- /dev/null +++ b/src/main/java/com/fzzy/async/fzzy35/repository/Fzzy35Sync1212Rep.java @@ -0,0 +1,28 @@ +package com.fzzy.async.fzzy35.repository; + +import com.fzzy.async.fzzy35.entity.Fz35InoutCustomer; +import com.fzzy.async.fzzy35.entity.Fz35MContract; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.Date; +import java.util.List; + +/** + * 绮璐攢-瀹㈡埛鍗曚綅淇℃伅鎺ュ彛鏁版嵁鑾峰彇 + */ +public interface Fzzy35Sync1212Rep extends JpaRepository<Fz35InoutCustomer, String> { + + /** + * 鏍规嵁淇℃伅鑾峰彇瀹㈡埛鍗曚綅淇℃伅 + * + * @return + */ + @Query("from Fz35InoutCustomer where deptId=:deptId order by id ") + List<Fz35InoutCustomer> listInoutCustomer(@Param("deptId") String deptId); + + + @Query("from Fz35InoutCustomer where khbh=:khbh ") + List<Fz35InoutCustomer> getDataById(@Param("khbh") String khbh); +} diff --git a/src/main/java/com/fzzy/async/fzzy40/impl/Fzzy40Sync1212.java b/src/main/java/com/fzzy/async/fzzy40/impl/Fzzy40Sync1212.java index adb09e6..7fbc451 100644 --- a/src/main/java/com/fzzy/async/fzzy40/impl/Fzzy40Sync1212.java +++ b/src/main/java/com/fzzy/async/fzzy40/impl/Fzzy40Sync1212.java @@ -3,7 +3,6 @@ import com.fzzy.api.Constant; import com.fzzy.api.entity.*; import com.fzzy.api.utils.ContextUtil; -import com.fzzy.api.view.repository.Api1101Rep; import com.fzzy.api.view.repository.Api1102Rep; import com.fzzy.api.view.repository.Api1212Rep; import com.fzzy.api.view.repository.ApiLogRep; @@ -27,8 +26,6 @@ private Fzzy40Sync1212Rep fzzySync1212Rep; @Autowired private Api1102Rep api1102Rep; - @Autowired - private Api1101Rep api1101Rep; @Autowired private Api1212Rep api1212Rep; @Autowired @@ -63,37 +60,33 @@ //鏍规嵁搴撳尯浠g爜鑾峰彇搴撳尯浠g爜 Api1102 api1201 = api1102Rep.findById(kqdm).get(); - List<Api1101> list1 = api1101Rep.findPushData(kqdm); - Api1101 api1101 = list1.get(0); Api1212 apiData; List<Api1212> api1212List; for (Fz40InoutCustomer sysData : list) { apiData = new Api1212(); - - apiData.setId(sysData.getId()); - //鍗曚綅浠g爜锛� 1101 鎺ュ彛鐨勫崟浣嶄唬 鐮侊級 +鑷畾涔夌紪鐮� - apiData.setDwdm(api1101.getDwdm()); - apiData.setDwmc(api1101.getDwmc()); - apiData.setKqmc(api1201.getKqmc()); + //鍗曚綅浠g爜 + apiData.setId(sysData.getKhbh()); + apiData.setDwdm(api1201.getDwdm()); apiData.setKqdm(kqdm); - apiData.setKhlx(StringUtils.isEmpty(sysData.getKhlx()) ? "1":sysData.getKhlx()); - apiData.setKhtyshxydmhsfzh(sysData.getCardId()); + apiData.setKhlx(sysData.getKhlx()); + apiData.setKhtyshxydmhsfzh(sysData.getKhbh()); apiData.setKhmc(sysData.getName()); - - apiData.setFddbr(StringUtils.isEmpty(sysData.getFddbr())? "娉曞畾浜�" : sysData.getFddbr()); - - apiData.setTxdz(sysData.getAddress()); - apiData.setYzbm(sysData.getYzbm()); - apiData.setLxrdh(sysData.getContactUser()); - apiData.setKhfkhh(sysData.getBank()); - apiData.setKhfzh(sysData.getBankNum()); + apiData.setFddbr(sysData.getFddbr()); + apiData.setTxdz(StringUtils.isEmpty(sysData.getAddress()) ? "鍗曚綅鍦板潃" :sysData.getAddress()); + apiData.setYzbm(StringUtils.isEmpty(sysData.getYzbm()) ? "" :sysData.getYzbm()); + apiData.setLxrxm(StringUtils.isEmpty(sysData.getContactUser()) ? sysData.getFddbr() :sysData.getContactUser()); + apiData.setLxrdh(StringUtils.isEmpty(sysData.getPhone()) ? "" :sysData.getPhone()); + apiData.setLxrsfzh(StringUtils.isEmpty(sysData.getCardId()) ? "100000000000000000" :sysData.getCardId()); + apiData.setDzyx(StringUtils.isEmpty(sysData.getDzyx()) ? "" :sysData.getDzyx()); +// apiData.setKhfkhh(StringUtils.isEmpty(sysData.getBank()) ? "" :sysData.getBank()); + apiData.setKhfzh(StringUtils.isEmpty(sysData.getBankNum()) ? "" :sysData.getBankNum()); + apiData.setZhgxsj(sysData.getUpdateTime()); apiData.setBizId(sysData.getId()); - apiData.setZhgxsj(new Date()); - api1212List = api1212Rep.getDataById(apiData.getId()); + api1212List = api1212Rep.getDataById(sysData.getKhbh()); if(null == api1212List || api1212List.isEmpty()){ apiData.setCzbz(Constant.CZBZ_I); }else { @@ -103,7 +96,7 @@ //淇濆瓨鏁版嵁 api1212Rep.save(apiData); - log.info("1201---鍚屾鏁版嵁锛歿}", apiData.toString()); + log.info("1212---鍚屾鏁版嵁锛歿}", apiData.toString()); } } catch (Exception e) { log.error("---鍚堝悓鍚屾鎵ц澶辫触----{}", e); diff --git a/src/main/java/com/fzzy/push/impl/ComPushService12.java b/src/main/java/com/fzzy/push/impl/ComPushService12.java index f9e1555..e38971e 100644 --- a/src/main/java/com/fzzy/push/impl/ComPushService12.java +++ b/src/main/java/com/fzzy/push/impl/ComPushService12.java @@ -46,7 +46,7 @@ */ public void pushData1109(ApiRemoteService apiRemoteService, ApiParam param) { - List<Api1109> items = api1109Rep.findPushData(param.getKqdm()); + List<Api1109> items = api1109Rep.findPushDataByTime(param.getKqdm(), param.getStart(), param.getEnd()); if (null == items || items.isEmpty()) { return; diff --git a/src/main/resources/application-pro.yml b/src/main/resources/application-pro.yml index 46074c8..249c112 100644 --- a/src/main/resources/application-pro.yml +++ b/src/main/resources/application-pro.yml @@ -1,4 +1,4 @@ -########################## 骞夸笢鎯犲窞鎯犻槼 ########################## +########################## 骞夸笢娼槼 ########################## server: port: 8090 jetty: @@ -38,7 +38,7 @@ dialect: org.hibernate.dialect.MySQL5InnoDBDialect # Redis鐩稿叧閰嶇疆 redis: - database: 1 + database: 0 host: 127.0.0.1 port: 6379 password: Abc123.. @@ -51,7 +51,7 @@ timeout: 6000 igds: default: - companyId: 5326 + companyId: 5317 file-path: D:/IGDS-API/FILE/ img-path: D:/IGDS/FILE/ \ No newline at end of file -- Gitblit v1.9.3