MachineUploadCarPaymentCmd.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. package com.java110.common.cmd.machineTranslate;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.java110.core.annotation.Java110Cmd;
  4. import com.java110.core.annotation.Java110Transactional;
  5. import com.java110.core.context.ICmdDataFlowContext;
  6. import com.java110.core.event.cmd.Cmd;
  7. import com.java110.core.event.cmd.CmdEvent;
  8. import com.java110.core.factory.GenerateCodeFactory;
  9. import com.java110.dto.CommunityMemberDto;
  10. import com.java110.dto.carInoutPayment.CarInoutPaymentDto;
  11. import com.java110.dto.fee.FeeAttrDto;
  12. import com.java110.dto.fee.FeeConfigDto;
  13. import com.java110.dto.fee.FeeDetailDto;
  14. import com.java110.dto.fee.FeeDto;
  15. import com.java110.dto.machine.CarInoutDto;
  16. import com.java110.dto.machine.MachineDto;
  17. import com.java110.dto.owner.OwnerCarDto;
  18. import com.java110.dto.owner.OwnerDto;
  19. import com.java110.dto.tempCarFeeConfig.TempCarFeeConfigDto;
  20. import com.java110.intf.common.ICarInoutPaymentV1InnerServiceSMO;
  21. import com.java110.intf.common.ICarInoutV1InnerServiceSMO;
  22. import com.java110.intf.common.IMachineInnerServiceSMO;
  23. import com.java110.intf.community.ICommunityInnerServiceSMO;
  24. import com.java110.intf.fee.IFeeAttrInnerServiceSMO;
  25. import com.java110.intf.fee.IFeeDetailInnerServiceSMO;
  26. import com.java110.intf.fee.IFeeInnerServiceSMO;
  27. import com.java110.intf.fee.ITempCarFeeConfigInnerServiceSMO;
  28. import com.java110.intf.user.IBuildingOwnerV1InnerServiceSMO;
  29. import com.java110.intf.user.IOwnerCarInnerServiceSMO;
  30. import com.java110.intf.user.IOwnerCarV1InnerServiceSMO;
  31. import com.java110.po.car.CarInoutPo;
  32. import com.java110.po.carInoutPayment.CarInoutPaymentPo;
  33. import com.java110.po.fee.FeeAttrPo;
  34. import com.java110.po.fee.PayFeeDetailPo;
  35. import com.java110.po.fee.PayFeePo;
  36. import com.java110.utils.exception.CmdException;
  37. import com.java110.utils.lock.DistributedLock;
  38. import com.java110.utils.util.Assert;
  39. import com.java110.utils.util.BeanConvertUtil;
  40. import com.java110.utils.util.DateUtil;
  41. import org.springframework.beans.factory.annotation.Autowired;
  42. import java.util.ArrayList;
  43. import java.util.List;
  44. /**
  45. * 类表述:车辆支付通知
  46. * 服务编码:machineTranslate.machineUploadCarLog
  47. * 请求路劲:/app/machineTranslate.machineUploadCarLog
  48. * add by 吴学文 at 2021-09-18 13:35:13 mail: 928255095@qq.com
  49. * open source address: https://gitee.com/wuxw7/MicroCommunity
  50. * 官网:http://www.homecommunity.cn
  51. * 温馨提示:如果您对此文件进行修改 请不要删除原有作者及注释信息,请补充您的 修改的原因以及联系邮箱如下
  52. * // modify by 张三 at 2021-09-12 第10行在某种场景下存在某种bug 需要修复,注释10至20行 加入 20行至30行
  53. */
  54. @Java110Cmd(serviceCode = "machineTranslate.machineUploadCarPaymentCmd")
  55. public class MachineUploadCarPaymentCmd extends Cmd {
  56. public static final String TEMP_CAR_OWNER = "临时车车主";
  57. @Autowired
  58. private IMachineInnerServiceSMO machineInnerServiceSMOImpl;
  59. @Autowired
  60. private IOwnerCarInnerServiceSMO ownerCarInnerServiceSMOImpl;
  61. @Autowired
  62. private ICarInoutV1InnerServiceSMO carInoutV1InnerServiceSMOImpl;
  63. @Autowired
  64. private IOwnerCarV1InnerServiceSMO ownerCarV1InnerServiceSMOImpl;
  65. @Autowired
  66. private ITempCarFeeConfigInnerServiceSMO tempCarFeeConfigInnerServiceSMOImpl;
  67. @Autowired
  68. private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
  69. @Autowired
  70. private IFeeAttrInnerServiceSMO feeAttrInnerServiceSMOImpl;
  71. @Autowired
  72. private ICommunityInnerServiceSMO communityInnerServiceSMOImpl;
  73. @Autowired
  74. private ICarInoutPaymentV1InnerServiceSMO carInoutPaymentV1InnerServiceSMOImpl;
  75. @Autowired
  76. private IFeeDetailInnerServiceSMO feeDetailInnerServiceSMOImpl;
  77. @Autowired
  78. private IBuildingOwnerV1InnerServiceSMO buildingOwnerV1InnerServiceSMOImpl;
  79. /**
  80. * data.put("carNum", carInoutDto.getCarNum());
  81. * data.put("machineCode", carInoutDto.getMachineCode());
  82. * data.put("communityId", communityDtos.get(0).getExtCommunityId());
  83. * data.put("payCharge", carInoutDto.getPayCharge());
  84. * data.put("realCharge", carInoutDto.getRealCharge());
  85. * data.put("payType", carInoutDto.getPayType());
  86. *
  87. * @param event 事件对象
  88. * @param cmdDataFlowContext 请求报文数据
  89. * @param reqJson
  90. */
  91. @Override
  92. public void validate(CmdEvent event, ICmdDataFlowContext cmdDataFlowContext, JSONObject reqJson) {
  93. Assert.hasKeyAndValue(reqJson, "machineCode", "必填,请填写设备编码");
  94. Assert.hasKeyAndValue(reqJson, "carNum", "必填,请填写车牌号");
  95. Assert.hasKeyAndValue(reqJson, "communityId", "必填,请填写小区");
  96. Assert.hasKeyAndValue(reqJson, "payCharge", "必填,请填写应收费用");
  97. Assert.hasKeyAndValue(reqJson, "realCharge", "必填,请填写实收费用");
  98. Assert.hasKeyAndValue(reqJson, "payType", "必填,请填写支付类型");
  99. }
  100. @Override
  101. @Java110Transactional
  102. public void doCmd(CmdEvent event, ICmdDataFlowContext cmdDataFlowContext, JSONObject reqJson) throws CmdException {
  103. //查询设备信息
  104. MachineDto machineDto = new MachineDto();
  105. machineDto.setMachineCode(reqJson.getString("machineCode"));
  106. machineDto.setCommunityId(reqJson.getString("communityId"));
  107. machineDto.setMachineTypeCd(MachineDto.MACHINE_TYPE_CAR);
  108. List<MachineDto> machineDtos = machineInnerServiceSMOImpl.queryMachines(machineDto);
  109. Assert.listOnlyOne(machineDtos, "设备不存在");
  110. CarInoutDto carInoutDto = new CarInoutDto();
  111. carInoutDto.setCommunityId(reqJson.getString("communityId"));
  112. carInoutDto.setCarNum(reqJson.getString("carNum"));
  113. carInoutDto.setPaId(machineDto.getLocationObjId());
  114. carInoutDto.setStates(new String[]{
  115. CarInoutDto.STATE_IN,
  116. CarInoutDto.STATE_PAY,
  117. CarInoutDto.STATE_REPAY
  118. });
  119. List<CarInoutDto> carInoutDtos = carInoutV1InnerServiceSMOImpl.queryCarInouts(carInoutDto);
  120. if (carInoutDtos == null || carInoutDtos.size() < 1) {
  121. //可能车辆异常情况 没有 进场 补充进场记录
  122. throw new CmdException("没有待支付记录");
  123. }
  124. //写支付记录
  125. CarInoutPaymentPo carInoutPaymentPo = new CarInoutPaymentPo();
  126. carInoutPaymentPo.setPaymentId(GenerateCodeFactory.getGeneratorId("10"));
  127. carInoutPaymentPo.setCommunityId(reqJson.getString("communityId"));
  128. carInoutPaymentPo.setInoutId(carInoutDtos.get(0).getInoutId());
  129. carInoutPaymentPo.setPaId(carInoutDtos.get(0).getPaId());
  130. carInoutPaymentPo.setPayCharge(reqJson.getString("payCharge"));
  131. carInoutPaymentPo.setPayType(reqJson.getString("payType"));
  132. carInoutPaymentPo.setRealCharge(reqJson.getString("realCharge"));
  133. int flag = carInoutPaymentV1InnerServiceSMOImpl.saveCarInoutPayment(carInoutPaymentPo);
  134. if (flag < 1) {
  135. throw new CmdException("更新费用失败");
  136. }
  137. CarInoutPo carInoutPo = updateCarInoutState(reqJson,machineDto,carInoutDtos.get(0));
  138. //如果有费用 则缴费
  139. boolean hasFee = hasFeeAndPayFee(carInoutPo, carInoutPaymentPo);
  140. double realCharge = Double.parseDouble(carInoutPaymentPo.getRealCharge());
  141. //有费用 或者 缴费为0 时结束
  142. if (hasFee || realCharge == 0) {
  143. return;
  144. }
  145. OwnerCarDto ownerCarDto = new OwnerCarDto();
  146. ownerCarDto.setCarNum(reqJson.getString("carNum"));
  147. ownerCarDto.setCommunityId(reqJson.getString("communityId"));
  148. ownerCarDto.setCarType(OwnerCarDto.CAR_TYPE_TEMP);
  149. List<OwnerCarDto> ownerCarDtos = ownerCarV1InnerServiceSMOImpl.queryOwnerCars(ownerCarDto);
  150. if (ownerCarDtos == null || ownerCarDtos.size() < 1) {
  151. return;
  152. }
  153. // 判断是否存在 临时车 虚拟业主
  154. OwnerDto ownerDto = new OwnerDto();
  155. ownerDto.setCommunityId(reqJson.getString("communityId"));
  156. ownerDto.setOwnerTypeCd(OwnerDto.OWNER_TYPE_CD_OWNER);
  157. ownerDto.setOwnerFlag(OwnerDto.OWNER_FLAG_FALSE);
  158. ownerDto.setName(TEMP_CAR_OWNER);
  159. List<OwnerDto> ownerDtos = buildingOwnerV1InnerServiceSMOImpl.queryBuildingOwners(ownerDto);
  160. if (ownerDtos == null || ownerDtos.size() < 1) {
  161. return;
  162. }
  163. JSONObject paramIn = new JSONObject();
  164. paramIn.put("inTime", carInoutDtos.get(0).getInTime());
  165. paramIn.put("carNum", reqJson.getString("carNum"));
  166. paramIn.put("carId", ownerCarDtos.get(0).getCarId());
  167. paramIn.put("communityId", carInoutDtos.get(0).getCommunityId());
  168. paramIn.put("inoutId", carInoutDtos.get(0).getInoutId());
  169. paramIn.put("ownerId", ownerDtos.get(0).getMemberId());
  170. saveTempCarFee(paramIn, machineDto, carInoutDtos.get(0));
  171. //再去缴费
  172. hasFeeAndPayFee(carInoutPo, carInoutPaymentPo);
  173. }
  174. private CarInoutPo updateCarInoutState(JSONObject reqJson,MachineDto machineDto,CarInoutDto carInoutDto) {
  175. int flag;
  176. String requestId = DistributedLock.getLockUUID();
  177. String key = "updateInoutState_" + carInoutDto.getInoutId();
  178. try {
  179. DistributedLock.waitGetDistributedLock(key, requestId);
  180. CarInoutDto newCarInoutDto = new CarInoutDto();
  181. newCarInoutDto.setCommunityId(reqJson.getString("communityId"));
  182. newCarInoutDto.setCarNum(reqJson.getString("carNum"));
  183. newCarInoutDto.setPaId(machineDto.getLocationObjId());
  184. newCarInoutDto.setStates(new String[]{
  185. CarInoutDto.STATE_IN,
  186. CarInoutDto.STATE_REPAY
  187. });
  188. List<CarInoutDto> carInoutDtos = carInoutV1InnerServiceSMOImpl.queryCarInouts(newCarInoutDto);
  189. if(carInoutDtos == null || carInoutDtos.size()<1){
  190. return BeanConvertUtil.covertBean(carInoutDto,CarInoutPo.class);
  191. }
  192. CarInoutPo carInoutPo = new CarInoutPo();
  193. carInoutPo.setInoutId(carInoutDto.getInoutId());
  194. carInoutPo.setPaId(carInoutDto.getPaId());
  195. carInoutPo.setCommunityId(carInoutDto.getCommunityId());
  196. carInoutPo.setState(CarInoutDto.STATE_PAY);
  197. flag = carInoutV1InnerServiceSMOImpl.updateCarInout(carInoutPo);
  198. if (flag < 1) {
  199. throw new CmdException("更新出场时间失败");
  200. }
  201. return carInoutPo;
  202. } finally {
  203. DistributedLock.releaseDistributedLock(requestId, key);
  204. }
  205. }
  206. private boolean hasFeeAndPayFee(CarInoutPo carInoutPo, CarInoutPaymentPo carInoutPaymentPo) {
  207. FeeAttrDto feeAttrDto = new FeeAttrDto();
  208. feeAttrDto.setCommunityId(carInoutPo.getCommunityId());
  209. feeAttrDto.setSpecCd(FeeAttrDto.SPEC_CD_CAR_INOUT_ID);
  210. feeAttrDto.setValue(carInoutPo.getInoutId());
  211. feeAttrDto.setState(FeeDto.STATE_DOING);
  212. List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFeeByAttr(feeAttrDto);
  213. if (feeDtos == null || feeDtos.size() < 1) {
  214. return false;
  215. }
  216. PayFeePo payFeePo = new PayFeePo();
  217. payFeePo.setState(FeeDto.STATE_FINISH);
  218. payFeePo.setFeeId(feeDtos.get(0).getFeeId());
  219. payFeePo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
  220. payFeePo.setCommunityId(feeDtos.get(0).getCommunityId());
  221. int flag = feeInnerServiceSMOImpl.updateFee(payFeePo);
  222. if (flag < 1) {
  223. throw new CmdException("更新费用失败");
  224. }
  225. PayFeeDetailPo payFeeDetailPo = new PayFeeDetailPo();
  226. payFeeDetailPo.setDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId));
  227. if (CarInoutPaymentDto.PAY_TYPE_CRASH.equals(carInoutPaymentPo.getPayType())) {
  228. payFeeDetailPo.setPrimeRate(FeeDetailDto.PRIME_REATE_CRASH);
  229. } else if (CarInoutPaymentDto.PAY_TYPE_WECHAT.equals(carInoutPaymentPo.getPayType())) {
  230. payFeeDetailPo.setPrimeRate(FeeDetailDto.PRIME_REATE_WECHAT_QRCODE);
  231. } else {
  232. payFeeDetailPo.setPrimeRate(FeeDetailDto.PRIME_REATE_ALI_QRCODE);
  233. }
  234. FeeDto feeDto = feeDtos.get(0);
  235. payFeeDetailPo.setStartTime(DateUtil.getFormatTimeString(feeDto.getStartTime(), DateUtil.DATE_FORMATE_STRING_A));
  236. payFeeDetailPo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
  237. payFeeDetailPo.setCommunityId(carInoutPo.getCommunityId());
  238. payFeeDetailPo.setCycles("1");
  239. payFeeDetailPo.setReceivableAmount(carInoutPaymentPo.getPayCharge());
  240. payFeeDetailPo.setReceivedAmount(carInoutPaymentPo.getRealCharge());
  241. payFeeDetailPo.setFeeId(feeDto.getFeeId());
  242. flag = feeDetailInnerServiceSMOImpl.saveFeeDetail(payFeeDetailPo);
  243. if (flag < 1) {
  244. throw new CmdException("更新费用失败");
  245. }
  246. return true;
  247. }
  248. private void saveTempCarFee(JSONObject reqJson, MachineDto machineDto, CarInoutDto carInoutDto) {
  249. //创建费用
  250. TempCarFeeConfigDto tempCarFeeConfigDto = new TempCarFeeConfigDto();
  251. tempCarFeeConfigDto.setCommunityId(reqJson.getString("communityId"));
  252. tempCarFeeConfigDto.setPaId(carInoutDto.getPaId());
  253. List<TempCarFeeConfigDto> tempCarFeeConfigDtos = tempCarFeeConfigInnerServiceSMOImpl.queryTempCarFeeConfigs(tempCarFeeConfigDto);
  254. if (tempCarFeeConfigDtos == null || tempCarFeeConfigDtos.size() < 1) { // 停车场未配置收费规则 则不创建费用
  255. return;
  256. }
  257. CommunityMemberDto communityMemberDto = new CommunityMemberDto();
  258. communityMemberDto.setCommunityId(reqJson.getString("communityId"));
  259. communityMemberDto.setMemberTypeCd(CommunityMemberDto.MEMBER_TYPE_PROPERTY);
  260. communityMemberDto.setAuditStatusCd(CommunityMemberDto.AUDIT_STATUS_NORMAL);
  261. List<CommunityMemberDto> communityMemberDtos = communityInnerServiceSMOImpl.getCommunityMembers(communityMemberDto);
  262. Assert.listOnlyOne(communityMemberDtos, "小区成员不存在");
  263. List<PayFeePo> payFeePos = new ArrayList<>();
  264. List<FeeAttrPo> feeAttrPos = new ArrayList<>();
  265. PayFeePo payFeePo = new PayFeePo();
  266. payFeePo.setFeeId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_feeId));
  267. payFeePo.setEndTime(reqJson.getString("inTime"));
  268. payFeePo.setState(FeeDto.STATE_DOING);
  269. payFeePo.setCommunityId(reqJson.getString("communityId"));
  270. payFeePo.setConfigId(tempCarFeeConfigDto.getFeeConfigId());
  271. payFeePo.setPayerObjId(reqJson.getString("carId"));
  272. payFeePo.setPayerObjType(FeeDto.PAYER_OBJ_TYPE_CAR);
  273. payFeePo.setUserId("-1");
  274. payFeePo.setIncomeObjId(communityMemberDtos.get(0).getMemberId());
  275. payFeePo.setFeeTypeCd(FeeConfigDto.FEE_TYPE_CD_PARKING);
  276. payFeePo.setFeeFlag(FeeDto.FEE_FLAG_ONCE);
  277. payFeePo.setAmount("-1");
  278. payFeePo.setBatchId("-1");
  279. //payFeePo.setStartTime(importRoomFee.getStartTime());
  280. payFeePo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
  281. payFeePos.add(payFeePo);
  282. FeeAttrPo feeAttrPo = new FeeAttrPo();
  283. feeAttrPo.setCommunityId(reqJson.getString("communityId"));
  284. feeAttrPo.setAttrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_attrId));
  285. feeAttrPo.setSpecCd(FeeAttrDto.SPEC_CD_ONCE_FEE_DEADLINE_TIME);
  286. feeAttrPo.setValue(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
  287. feeAttrPo.setFeeId(payFeePo.getFeeId());
  288. feeAttrPos.add(feeAttrPo);
  289. feeAttrPo = new FeeAttrPo();
  290. feeAttrPo.setCommunityId(reqJson.getString("communityId"));
  291. feeAttrPo.setAttrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_attrId));
  292. feeAttrPo.setSpecCd(FeeAttrDto.SPEC_CD_OWNER_ID);
  293. feeAttrPo.setValue(reqJson.getString("ownerId"));
  294. feeAttrPo.setFeeId(payFeePo.getFeeId());
  295. feeAttrPos.add(feeAttrPo);
  296. feeAttrPo = new FeeAttrPo();
  297. feeAttrPo.setCommunityId(reqJson.getString("communityId"));
  298. feeAttrPo.setAttrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_attrId));
  299. feeAttrPo.setSpecCd(FeeAttrDto.SPEC_CD_OWNER_NAME);
  300. feeAttrPo.setValue(TEMP_CAR_OWNER);
  301. feeAttrPo.setFeeId(payFeePo.getFeeId());
  302. feeAttrPos.add(feeAttrPo);
  303. feeAttrPo = new FeeAttrPo();
  304. feeAttrPo.setCommunityId(reqJson.getString("communityId"));
  305. feeAttrPo.setAttrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_attrId));
  306. feeAttrPo.setSpecCd(FeeAttrDto.SPEC_CD_OWNER_LINK);
  307. feeAttrPo.setValue("11111111111");
  308. feeAttrPo.setFeeId(payFeePo.getFeeId());
  309. feeAttrPos.add(feeAttrPo);
  310. feeAttrPo = new FeeAttrPo();
  311. feeAttrPo.setCommunityId(reqJson.getString("communityId"));
  312. feeAttrPo.setAttrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_attrId));
  313. feeAttrPo.setSpecCd(FeeAttrDto.SPEC_CD_CAR_INOUT_ID);
  314. feeAttrPo.setValue(reqJson.getString("inoutId"));
  315. feeAttrPo.setFeeId(payFeePo.getFeeId());
  316. feeAttrPos.add(feeAttrPo);
  317. int flag = feeInnerServiceSMOImpl.saveFee(payFeePos);
  318. if (flag < 1) {
  319. throw new CmdException("保存临时车费用失败");
  320. }
  321. flag = feeAttrInnerServiceSMOImpl.saveFeeAttrs(feeAttrPos);
  322. if (flag < 1) {
  323. throw new CmdException("保存临时车费用属性失败");
  324. }
  325. }
  326. }