SaveOwnerCmd.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. package com.java110.user.cmd.owner;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.java110.core.annotation.Java110Cmd;
  5. import com.java110.core.annotation.Java110Transactional;
  6. import com.java110.core.context.ICmdDataFlowContext;
  7. import com.java110.core.event.cmd.Cmd;
  8. import com.java110.core.event.cmd.CmdEvent;
  9. import com.java110.core.factory.AuthenticationFactory;
  10. import com.java110.core.factory.GenerateCodeFactory;
  11. import com.java110.core.factory.SendSmsFactory;
  12. import com.java110.core.smo.IPhotoSMO;
  13. import com.java110.doc.annotation.*;
  14. import com.java110.dto.account.AccountDto;
  15. import com.java110.dto.community.CommunityDto;
  16. import com.java110.dto.file.FileDto;
  17. import com.java110.dto.msg.SmsDto;
  18. import com.java110.dto.owner.OwnerDto;
  19. import com.java110.intf.acct.IAccountInnerServiceSMO;
  20. import com.java110.intf.common.IFileInnerServiceSMO;
  21. import com.java110.intf.common.IFileRelInnerServiceSMO;
  22. import com.java110.intf.common.ISmsInnerServiceSMO;
  23. import com.java110.intf.community.ICommunityInnerServiceSMO;
  24. import com.java110.intf.community.ICommunityV1InnerServiceSMO;
  25. import com.java110.intf.user.*;
  26. import com.java110.po.account.AccountPo;
  27. import com.java110.po.file.FileRelPo;
  28. import com.java110.po.owner.OwnerAppUserPo;
  29. import com.java110.po.owner.OwnerAttrPo;
  30. import com.java110.po.owner.OwnerPo;
  31. import com.java110.po.owner.OwnerRoomRelPo;
  32. import com.java110.po.user.UserPo;
  33. import com.java110.utils.cache.MappingCache;
  34. import com.java110.utils.constant.UserLevelConstant;
  35. import com.java110.utils.exception.CmdException;
  36. import com.java110.utils.lock.DistributedLock;
  37. import com.java110.utils.util.Assert;
  38. import com.java110.utils.util.BeanConvertUtil;
  39. import com.java110.utils.util.StringUtil;
  40. import org.apache.commons.lang3.StringUtils;
  41. import org.springframework.beans.factory.annotation.Autowired;
  42. import java.util.ArrayList;
  43. import java.util.List;
  44. /**
  45. * 保存 业主
  46. */
  47. @Java110CmdDoc(title = "添加业主",
  48. description = "第三方系统,比如招商系统同步业主信息",
  49. httpMethod = "post",
  50. url = "http://{ip}:{port}/app/owner.saveOwner",
  51. resource = "userDoc",
  52. author = "吴学文",
  53. serviceCode = "owner.saveOwner"
  54. )
  55. @Java110ParamsDoc(params = {
  56. @Java110ParamDoc(name = "communityId", length = 30, remark = "小区ID"),
  57. @Java110ParamDoc(name = "name", length = 64, remark = "业主名称"),
  58. @Java110ParamDoc(name = "link", length = 11, remark = "业主手机号"),
  59. @Java110ParamDoc(name = "idCard", length = 30, remark = "业主身份证号"),
  60. @Java110ParamDoc(name = "address", length = 512, remark = "地址"),
  61. @Java110ParamDoc(name = "sex", length = 12, remark = "性别 男 1 女 0"),
  62. @Java110ParamDoc(name = "ownerTypeCd", length = 12, remark = "业主类型 1001 业主 2002 家庭成员 家庭成员 需要传业主的ownerId"),
  63. @Java110ParamDoc(name = "remark", length = 512, remark = "备注"),
  64. @Java110ParamDoc(name = "ownerId", length = 30, remark = "业主 时 填写-1 家庭成员时填写业主ID"),
  65. @Java110ParamDoc(name = "ownerPhoto", length = -1, remark = "业主人脸 用于同步门禁 人脸开门"),
  66. })
  67. @Java110ResponseDoc(
  68. params = {
  69. @Java110ParamDoc(name = "code", type = "int", length = 11, defaultValue = "0", remark = "返回编号,0 成功 其他失败"),
  70. @Java110ParamDoc(name = "msg", type = "String", length = 250, defaultValue = "成功", remark = "描述"),
  71. }
  72. )
  73. @Java110ExampleDoc(
  74. reqBody = "{\n" +
  75. "\t\"name\": \"王王\",\n" +
  76. "\t\"age\": \"\",\n" +
  77. "\t\"link\": \"18909718888\",\n" +
  78. "\t\"address\": \"张三\",\n" +
  79. "\t\"sex\": \"0\",\n" +
  80. "\t\"ownerTypeCd\": \"1001\",\n" +
  81. "\t\"remark\": \"\",\n" +
  82. "\t\"ownerId\": -1,\n" +
  83. "\t\"ownerPhoto\": \"\",\n" +
  84. "\t\"idCard\": \"\",\n" +
  85. "\t\"communityId\": \"2022121921870161\"\n" +
  86. "}",
  87. resBody = "{\"code\":0,\"msg\":\"成功\"}"
  88. )
  89. @Java110Cmd(serviceCode = "owner.saveOwner")
  90. public class SaveOwnerCmd extends Cmd {
  91. @Autowired
  92. private IOwnerInnerServiceSMO ownerInnerServiceSMOImpl;
  93. @Autowired
  94. private ISmsInnerServiceSMO smsInnerServiceSMOImpl;
  95. @Autowired
  96. private IFileRelInnerServiceSMO fileRelInnerServiceSMOImpl;
  97. @Autowired
  98. private IFileInnerServiceSMO fileInnerServiceSMOImpl;
  99. @Autowired
  100. private IOwnerV1InnerServiceSMO ownerV1InnerServiceSMOImpl;
  101. @Autowired
  102. private IOwnerAttrInnerServiceSMO ownerAttrInnerServiceSMOImpl;
  103. @Autowired
  104. private IOwnerRoomRelV1InnerServiceSMO ownerRoomRelV1InnerServiceSMOImpl;
  105. @Autowired
  106. private ICommunityV1InnerServiceSMO communityV1InnerServiceSMOImpl;
  107. @Autowired
  108. private IPhotoSMO photoSMOImpl;
  109. @Autowired
  110. private IOwnerAppUserV1InnerServiceSMO ownerAppUserV1InnerServiceSMOImpl;
  111. @Autowired
  112. private ICommunityInnerServiceSMO communityInnerServiceSMOImpl;
  113. @Autowired
  114. private IUserV1InnerServiceSMO userV1InnerServiceSMOImpl;
  115. @Autowired
  116. private IAccountInnerServiceSMO accountInnerServiceSMOImpl;
  117. @Override
  118. public void validate(CmdEvent event, ICmdDataFlowContext cmdDataFlowContext, JSONObject reqJson) throws CmdException {
  119. Assert.jsonObjectHaveKey(reqJson, "name", "请求报文中未包含name");
  120. Assert.jsonObjectHaveKey(reqJson, "userId", "请求报文中未包含userId");
  121. Assert.jsonObjectHaveKey(reqJson, "age", "请求报文中未包含age");
  122. Assert.jsonObjectHaveKey(reqJson, "link", "请求报文中未包含link");
  123. Assert.jsonObjectHaveKey(reqJson, "sex", "请求报文中未包含sex");
  124. Assert.jsonObjectHaveKey(reqJson, "ownerTypeCd", "请求报文中未包含类型");
  125. Assert.jsonObjectHaveKey(reqJson, "communityId", "请求报文中未包含communityId");
  126. //Assert.jsonObjectHaveKey(paramIn, "idCard", "请求报文中未包含身份证号");
  127. if (reqJson.containsKey("roomId")) {
  128. Assert.jsonObjectHaveKey(reqJson, "state", "请求报文中未包含state节点");
  129. Assert.jsonObjectHaveKey(reqJson, "storeId", "请求报文中未包含storeId节点");
  130. Assert.hasLength(reqJson.getString("roomId"), "roomId不能为空");
  131. Assert.hasLength(reqJson.getString("state"), "state不能为空");
  132. Assert.hasLength(reqJson.getString("storeId"), "storeId不能为空");
  133. }
  134. if (reqJson.containsKey("msgCode")) {
  135. SmsDto smsDto = new SmsDto();
  136. smsDto.setTel(reqJson.getString("link"));
  137. smsDto.setCode(reqJson.getString("msgCode"));
  138. smsDto = smsInnerServiceSMOImpl.validateCode(smsDto);
  139. if (!smsDto.isSuccess() && "ON".equals(MappingCache.getValue(SendSmsFactory.SMS_SEND_SWITCH))) {
  140. throw new IllegalArgumentException(smsDto.getMsg());
  141. }
  142. }
  143. //属性校验
  144. Assert.judgeAttrValue(reqJson);
  145. }
  146. @Override
  147. @Java110Transactional
  148. public void doCmd(CmdEvent event, ICmdDataFlowContext cmdDataFlowContext, JSONObject reqJson) throws CmdException {
  149. String userValidate = MappingCache.getValue("USER_VALIDATE");
  150. if ((!reqJson.containsKey("source") || !"BatchImport".equals(reqJson.getString("source"))) && "ON".equals(userValidate)) {
  151. //获取手机号(判断手机号是否重复)
  152. String link = reqJson.getString("link");
  153. OwnerDto ownerDto = new OwnerDto();
  154. ownerDto.setLink(link);
  155. ownerDto.setCommunityId(reqJson.getString("communityId"));
  156. List<OwnerDto> ownerDtos = ownerInnerServiceSMOImpl.queryAllOwners(ownerDto);
  157. Assert.listIsNull(ownerDtos, "手机号重复,请重新输入");
  158. //获取身份证号(判断身份证号是否重复)
  159. String idCard = reqJson.getString("idCard");
  160. if (!StringUtil.isEmpty(idCard)) {
  161. OwnerDto owner = new OwnerDto();
  162. owner.setIdCard(idCard);
  163. owner.setCommunityId(reqJson.getString("communityId"));
  164. List<OwnerDto> owners = ownerInnerServiceSMOImpl.queryAllOwners(owner);
  165. Assert.listIsNull(owners, "身份证号重复,请重新输入");
  166. }
  167. }
  168. //生成memberId
  169. generateMemberId(reqJson);
  170. JSONObject businessOwner = new JSONObject();
  171. businessOwner.putAll(reqJson);
  172. businessOwner.put("state", "2000");
  173. OwnerPo ownerPo = BeanConvertUtil.covertBean(businessOwner, OwnerPo.class);
  174. if (reqJson.containsKey("age") && StringUtil.isEmpty(reqJson.getString("age"))) {
  175. ownerPo.setAge(null);
  176. }
  177. int flag = ownerV1InnerServiceSMOImpl.saveOwner(ownerPo);
  178. if (flag < 1) {
  179. throw new CmdException("保存业主失败");
  180. }
  181. //有房屋信息,则直接绑定房屋和 业主的关系
  182. if (reqJson.containsKey("roomId")) {
  183. JSONObject businessUnit = new JSONObject();
  184. businessUnit.putAll(reqJson);
  185. businessUnit.put("relId", GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_relId));
  186. OwnerRoomRelPo ownerRoomRelPo = BeanConvertUtil.covertBean(businessUnit, OwnerRoomRelPo.class);
  187. flag = ownerRoomRelV1InnerServiceSMOImpl.saveOwnerRoomRel(ownerRoomRelPo);
  188. if (flag < 1) {
  189. throw new CmdException("保存业主房屋关系失败");
  190. }
  191. }
  192. //保存照片
  193. photoSMOImpl.savePhoto(reqJson.getString("ownerPhoto"),
  194. reqJson.getString("memberId"),
  195. reqJson.getString("communityId"),
  196. "10000");
  197. dealOwnerAttr(reqJson, cmdDataFlowContext);
  198. //业主 开通 现金账户,不然配合商城 会存在bug
  199. addAccountDto(ownerPo.getMemberId(),ownerPo.getCommunityId());
  200. String autoUser = MappingCache.getValue("OWNER", "AUTO_GENERATOR_OWNER_USER");
  201. if (!"ON".equals(autoUser)) {
  202. return;
  203. }
  204. CommunityDto communityDto = new CommunityDto();
  205. communityDto.setCommunityId(ownerPo.getCommunityId());
  206. List<CommunityDto> communityDtos = communityInnerServiceSMOImpl.queryCommunitys(communityDto);
  207. Assert.listNotNull(communityDtos, "未包含小区信息");
  208. CommunityDto tmpCommunityDto = communityDtos.get(0);
  209. UserPo userPo = new UserPo();
  210. userPo.setUserId(GenerateCodeFactory.getUserId());
  211. userPo.setName(ownerPo.getName());
  212. userPo.setTel(ownerPo.getLink());
  213. userPo.setPassword(AuthenticationFactory.passwdMd5(ownerPo.getLink()));
  214. userPo.setLevelCd(UserLevelConstant.USER_LEVEL_ORDINARY);
  215. userPo.setAge(ownerPo.getAge());
  216. userPo.setAddress(ownerPo.getAddress());
  217. userPo.setSex(ownerPo.getSex());
  218. flag = userV1InnerServiceSMOImpl.saveUser(userPo);
  219. if (flag < 1) {
  220. throw new CmdException("注册失败");
  221. }
  222. OwnerAppUserPo ownerAppUserPo = new OwnerAppUserPo();
  223. //状态类型,10000 审核中,12000 审核成功,13000 审核失败
  224. ownerAppUserPo.setState("12000");
  225. ownerAppUserPo.setAppTypeCd("10010");
  226. ownerAppUserPo.setAppUserId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_appUserId));
  227. ownerAppUserPo.setMemberId(ownerPo.getMemberId());
  228. ownerAppUserPo.setCommunityName(tmpCommunityDto.getName());
  229. ownerAppUserPo.setCommunityId(ownerPo.getCommunityId());
  230. ownerAppUserPo.setAppUserName(ownerPo.getName());
  231. ownerAppUserPo.setIdCard(ownerPo.getIdCard());
  232. ownerAppUserPo.setAppType("WECHAT");
  233. ownerAppUserPo.setLink(ownerPo.getLink());
  234. ownerAppUserPo.setUserId(userPo.getUserId());
  235. ownerAppUserPo.setOpenId("-1");
  236. flag = ownerAppUserV1InnerServiceSMOImpl.saveOwnerAppUser(ownerAppUserPo);
  237. if (flag < 1) {
  238. throw new CmdException("添加用户业主关系失败");
  239. }
  240. }
  241. private void addAccountDto(String ownerId,String communityId) {
  242. if (StringUtil.isEmpty(ownerId)) {
  243. return ;
  244. }
  245. //开始锁代码
  246. String requestId = DistributedLock.getLockUUID();
  247. String key = this.getClass().getSimpleName() + "AddCountDto" +ownerId;
  248. try {
  249. DistributedLock.waitGetDistributedLock(key, requestId);
  250. AccountPo accountPo = new AccountPo();
  251. accountPo.setAmount("0");
  252. accountPo.setAcctId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_acctId));
  253. accountPo.setObjId(ownerId);
  254. accountPo.setObjType(AccountDto.OBJ_TYPE_PERSON);
  255. accountPo.setAcctType(AccountDto.ACCT_TYPE_CASH);
  256. OwnerDto tmpOwnerDto = new OwnerDto();
  257. tmpOwnerDto.setMemberId(ownerId);
  258. tmpOwnerDto.setCommunityId(communityId);
  259. List<OwnerDto> ownerDtos = ownerInnerServiceSMOImpl.queryOwners(tmpOwnerDto);
  260. Assert.listOnlyOne(ownerDtos, "业主不存在");
  261. accountPo.setAcctName(ownerDtos.get(0).getName());
  262. accountPo.setPartId(communityId);
  263. accountInnerServiceSMOImpl.saveAccount(accountPo);
  264. } finally {
  265. DistributedLock.releaseDistributedLock(requestId, key);
  266. }
  267. }
  268. /**
  269. * 生成小区楼ID
  270. *
  271. * @param paramObj 请求入参数据
  272. */
  273. private void generateMemberId(JSONObject paramObj) {
  274. String memberId = GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_ownerId);
  275. paramObj.put("memberId", memberId);
  276. if (!paramObj.containsKey("ownerId") || OwnerDto.OWNER_TYPE_CD_OWNER.equals(paramObj.getString("ownerTypeCd"))) {
  277. paramObj.put("ownerId", memberId);
  278. }
  279. }
  280. private void dealOwnerAttr(JSONObject paramObj, ICmdDataFlowContext cmdDataFlowContext) {
  281. if (!paramObj.containsKey("attrs")) {
  282. return;
  283. }
  284. JSONArray attrs = paramObj.getJSONArray("attrs");
  285. if (attrs.size() < 1) {
  286. return;
  287. }
  288. int flag = 0;
  289. JSONObject attr = null;
  290. for (int attrIndex = 0; attrIndex < attrs.size(); attrIndex++) {
  291. attr = attrs.getJSONObject(attrIndex);
  292. attr.put("communityId", paramObj.getString("communityId"));
  293. attr.put("memberId", paramObj.getString("memberId"));
  294. attr.put("attrId", GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_attrId));
  295. OwnerAttrPo ownerAttrPo = BeanConvertUtil.covertBean(attr, OwnerAttrPo.class);
  296. flag = ownerAttrInnerServiceSMOImpl.saveOwnerAttr(ownerAttrPo);
  297. if (flag < 1) {
  298. throw new CmdException("保存业主房屋关系失败");
  299. }
  300. }
  301. }
  302. }