CustomerServiceImpl.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. package com.goafanti.customer.service.impl;
  2. import java.lang.reflect.InvocationTargetException;
  3. import java.text.ParseException;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Date;
  6. import java.util.HashMap;
  7. import java.util.HashSet;
  8. import java.util.List;
  9. import java.util.Map;
  10. import java.util.Set;
  11. import java.util.UUID;
  12. import javax.annotation.Resource;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.stereotype.Service;
  15. import org.springframework.transaction.annotation.Transactional;
  16. import com.goafanti.common.bo.Error;
  17. import com.goafanti.common.constant.AFTConstants;
  18. import com.goafanti.common.dao.BusinessGlossoryMapper;
  19. import com.goafanti.common.dao.OrganizationContactBookMapper;
  20. import com.goafanti.common.dao.OrganizationIdentityMapper;
  21. import com.goafanti.common.dao.UserBusinessMapper;
  22. import com.goafanti.common.dao.UserFollowBusinessMapper;
  23. import com.goafanti.common.dao.UserFollowMapper;
  24. import com.goafanti.common.dao.UserIdentityMapper;
  25. import com.goafanti.common.dao.UserMapper;
  26. import com.goafanti.common.error.BusinessException;
  27. import com.goafanti.common.model.OrganizationContactBook;
  28. import com.goafanti.common.model.OrganizationIdentity;
  29. import com.goafanti.common.model.User;
  30. import com.goafanti.common.model.UserBusiness;
  31. import com.goafanti.common.model.UserFollow;
  32. import com.goafanti.common.model.UserFollowBusiness;
  33. import com.goafanti.common.model.UserIdentity;
  34. import com.goafanti.common.utils.BeanUtilsExt;
  35. import com.goafanti.common.utils.PasswordUtil;
  36. import com.goafanti.common.utils.StringUtils;
  37. import com.goafanti.core.mybatis.BaseMybatisDao;
  38. import com.goafanti.core.mybatis.page.Pagination;
  39. import com.goafanti.core.shiro.token.TokenManager;
  40. import com.goafanti.customer.bo.CustomerListIn;
  41. import com.goafanti.customer.bo.CustomerListOut;
  42. import com.goafanti.customer.bo.CustomerOrganizationDetailBo;
  43. import com.goafanti.customer.bo.CustomerPersonalDetailBo;
  44. import com.goafanti.customer.bo.CustomerSimpleBo;
  45. import com.goafanti.customer.bo.FollowBusinessBo;
  46. import com.goafanti.customer.bo.FollowListBo;
  47. import com.goafanti.customer.service.CustomerService;
  48. @Service
  49. public class CustomerServiceImpl extends BaseMybatisDao<UserMapper> implements CustomerService {
  50. @Autowired
  51. private UserMapper userMapper;
  52. @Autowired
  53. private UserIdentityMapper userIdentityMapper;
  54. @Autowired
  55. private OrganizationIdentityMapper organizationIdentityMapper;
  56. @Autowired
  57. private OrganizationContactBookMapper organizationContactBookMapper;
  58. @Resource(name = "passwordUtil")
  59. private PasswordUtil passwordUtil;
  60. @Resource
  61. private UserFollowMapper userFollowMapper;
  62. @Resource
  63. private UserBusinessMapper userBusinessMapper;
  64. @Resource
  65. private UserFollowBusinessMapper userFollowBusinessMapper;
  66. @Resource
  67. private BusinessGlossoryMapper businessGlossoryMapper;
  68. @Override
  69. public Pagination<CustomerListOut> listPrivatePersonalCustomer(CustomerListIn cli, Integer pageNo,Integer pageSize) {
  70. cli.setType(AFTConstants.USER_TYPE_PERSONAL);
  71. cli.setAid(TokenManager.getAdminId());
  72. cli.setShareType(AFTConstants.SHARE_TYPE_PRIVATE);
  73. Map<String,Object> params = disposeParams(cli);
  74. @SuppressWarnings("unchecked")
  75. Pagination<CustomerListOut> list = (Pagination<CustomerListOut>) findPage("selectPersonalCustomerList","selectPersonalCustomerCount",params,pageNo,pageSize);
  76. return list;
  77. }
  78. @Override
  79. public Pagination<CustomerListOut> listPublicPersonalCustomer(CustomerListIn cli, Integer pageNo,Integer pageSize) {
  80. cli.setType(AFTConstants.USER_TYPE_PERSONAL);
  81. cli.setAid(TokenManager.getAdminId());
  82. cli.setShareType(AFTConstants.SHARE_TYPE_PUBLIC);
  83. Map<String,Object> params = disposeParams(cli);
  84. @SuppressWarnings("unchecked")
  85. Pagination<CustomerListOut> list = (Pagination<CustomerListOut>) findPage("selectPersonalCustomerList","selectPersonalCustomerCount",params,pageNo,pageSize);
  86. return list;
  87. }
  88. @Override
  89. public Pagination<CustomerListOut> listAllPersonalCustomer(CustomerListIn cli, Integer pageNo, Integer pageSize) {
  90. cli.setType(AFTConstants.USER_TYPE_PERSONAL);
  91. Map<String,Object> params = disposeParams(cli);
  92. @SuppressWarnings("unchecked")
  93. Pagination<CustomerListOut> list = (Pagination<CustomerListOut>) findPage("selectPersonalCustomerList","selectPersonalCustomerCount",params,pageNo,pageSize);
  94. return list;
  95. }
  96. @Override
  97. public Pagination<CustomerListOut> listPrivateOrganizationCustomer(CustomerListIn cli, Integer pageNo,Integer pageSize) {
  98. cli.setType(AFTConstants.USER_TYPE_ORGANIZATION);
  99. cli.setAid(TokenManager.getAdminId());
  100. cli.setShareType(AFTConstants.SHARE_TYPE_PRIVATE);
  101. Map<String,Object> params = disposeParams(cli);
  102. @SuppressWarnings("unchecked")
  103. Pagination<CustomerListOut> list = (Pagination<CustomerListOut>) findPage("selectOrganizationCustomerList","selectOrganizationCustomerCount",params,pageNo,pageSize);
  104. return list;
  105. }
  106. @Override
  107. public Pagination<CustomerListOut> listPublicOrganizationCustomer(CustomerListIn cli, Integer pageNo,Integer pageSize) {
  108. cli.setType(AFTConstants.USER_TYPE_ORGANIZATION);
  109. cli.setAid(TokenManager.getAdminId());
  110. cli.setShareType(AFTConstants.SHARE_TYPE_PUBLIC);
  111. Map<String,Object> params = disposeParams(cli);
  112. @SuppressWarnings("unchecked")
  113. Pagination<CustomerListOut> list = (Pagination<CustomerListOut>) findPage("selectOrganizationCustomerList","selectOrganizationCustomerCount",params,pageNo,pageSize);
  114. return list;
  115. }
  116. @Override
  117. public Pagination<CustomerListOut> listAllOrganizationCustomer(CustomerListIn cli, Integer pageNo,Integer pageSize) {
  118. cli.setType(AFTConstants.USER_TYPE_ORGANIZATION);
  119. Map<String,Object> params = disposeParams(cli);
  120. @SuppressWarnings("unchecked")
  121. Pagination<CustomerListOut> list = (Pagination<CustomerListOut>) findPage("selectOrganizationCustomerList","selectOrganizationCustomerCount",params,pageNo,pageSize);
  122. return list;
  123. }
  124. private Map<String,Object> disposeParams(CustomerListIn cli){
  125. Map<String,Object> params = new HashMap<String, Object>();
  126. if(StringUtils.isNotBlank(cli.getType())) params.put("type", Integer.parseInt(cli.getType()));
  127. if(StringUtils.isNotBlank(cli.getShareType())) params.put("shareType", Integer.parseInt(cli.getShareType()));
  128. if(StringUtils.isNotBlank(cli.getName())) params.put("name", cli.getName());
  129. if(StringUtils.isNotBlank(cli.getProvince())) params.put("province", Integer.parseInt(cli.getProvince()));
  130. if(StringUtils.isNotBlank(cli.getCity())) params.put("city", Integer.parseInt(cli.getCity()));
  131. if(StringUtils.isNotBlank(cli.getArea())) params.put("area", Integer.parseInt(cli.getArea()));
  132. if(StringUtils.isNotBlank(cli.getContacts())) params.put("contacts", cli.getContacts());
  133. if(StringUtils.isNotBlank(cli.getContactMobile())) params.put("contactMobile", cli.getContactMobile());
  134. if(StringUtils.isNotBlank(cli.getStartDate())) params.put("startDate", cli.getStartDate());
  135. if(StringUtils.isNotBlank(cli.getEndDate())) params.put("endDate", cli.getEndDate());
  136. if(StringUtils.isNotBlank(cli.getExpert())) params.put("expert", Integer.parseInt(cli.getExpert()));
  137. if(StringUtils.isNotBlank(cli.getIndustry())) params.put("indust", Integer.parseInt(cli.getIndustry()));
  138. if(StringUtils.isNotBlank(cli.getInternational())) params.put("international", Integer.parseInt(cli.getInternational()));
  139. if(StringUtils.isNotBlank(cli.getServiceCertification())) params.put("serviceCertification", Integer.parseInt(cli.getServiceCertification()));
  140. if(StringUtils.isNotBlank(cli.getUserCertification())) params.put("userCertification", Integer.parseInt(cli.getUserCertification()));
  141. if(StringUtils.isNotBlank(cli.getCurrentMemberStatus())) params.put("currentMemberStatus", Integer.parseInt(cli.getUserCertification()));
  142. if(StringUtils.isNotBlank(cli.getLvl())) params.put("lvl", Integer.parseInt(cli.getLvl()));
  143. if(StringUtils.isNotBlank(cli.getListed())) params.put("listed", Integer.parseInt(cli.getListed()));
  144. if(StringUtils.isNotBlank(cli.getHighTechZone())) params.put("highTechZone", Integer.parseInt(cli.getHighTechZone()));
  145. if(StringUtils.isNotBlank(cli.getAid())) params.put("aid", cli.getAid());
  146. if(StringUtils.isNotBlank(cli.getIsMember())) params.put("isMember", Integer.parseInt(cli.getIsMember()));
  147. if(StringUtils.isNotBlank(cli.getStartDate())) params.put("startDate", cli.getStartDate()+" 00:00:00");
  148. if(StringUtils.isNotBlank(cli.getEndDate())) params.put("endDate", cli.getEndDate()+" 23:59:59");
  149. return params;
  150. }
  151. @Override
  152. public List<CustomerSimpleBo> findCustomerByName(String name) {
  153. return userMapper.findCustomerByName(name);
  154. }
  155. @Override
  156. public int judgeCustomerByName(String name) {
  157. return userMapper.judgeCustomerByName(name);
  158. }
  159. @Override
  160. @Transactional
  161. public int addCustomer(String name, String contacts, String contactMobile, Integer type){
  162. User user = new User();
  163. Date now = new Date();
  164. String uid = UUID.randomUUID().toString();
  165. String identifyId = UUID.randomUUID().toString();
  166. user.setId(uid);
  167. user.setIdentifyName(name);
  168. user.setSource(1);
  169. user.setNickname(name);
  170. user.setStatus(0);
  171. user.setShareType(0);
  172. user.setServiceCertification(0);
  173. user.setUserCertification(0);
  174. user.setAid(TokenManager.getAdminId());
  175. user.setType(type);
  176. user.setCurrentMemberStatus(0);
  177. user.setLvl(0);
  178. user.setCreateTime(now);
  179. user.setUpdateTime(now);
  180. user.setMobile(contactMobile);
  181. user.setPassword(AFTConstants.INITIALPASSWORD);
  182. passwordUtil.encryptPassword(user);
  183. if(type == 0){
  184. UserIdentity ui = new UserIdentity();
  185. ui.setId(identifyId);
  186. ui.setUid(uid);
  187. ui.setContacts(contacts);
  188. ui.setContactMobile(contactMobile);
  189. ui.setUsername(name);
  190. ui.setExpert(0);
  191. ui.setCelebrity(0);
  192. ui.setInternational(0);
  193. ui.setAuditStatus(0);
  194. userIdentityMapper.insert(ui);
  195. }else if(type == 1){
  196. if(userMapper.judgeCustomerByName(name)>1) throw new BusinessException("该客户已存在");
  197. // 创建企业认证信息
  198. OrganizationIdentity oi = new OrganizationIdentity();
  199. oi.setUnitName(name);
  200. oi.setId(identifyId);
  201. oi.setUid(uid);
  202. oi.setContacts(contacts);
  203. oi.setContactMobile(contactMobile);
  204. oi.setHighTechZone(0);
  205. oi.setInternational(0);
  206. oi.setListed(0);
  207. oi.setAuditStatus(0);
  208. organizationIdentityMapper.insert(oi);
  209. }
  210. userMapper.insert(user);
  211. //新增企业联系人
  212. OrganizationContactBook cob = new OrganizationContactBook();
  213. cob.setAid(TokenManager.getAdminId());
  214. cob.setId(UUID.randomUUID().toString());
  215. cob.setUid(identifyId);
  216. cob.setName(contacts);
  217. cob.setMobile(contactMobile);
  218. organizationContactBookMapper.insert(cob);
  219. return 1;
  220. }
  221. @Override
  222. public CustomerPersonalDetailBo findPersonalCustomerDetail(String uid) {
  223. return userMapper.findPersonalCustomerDetail(uid);
  224. }
  225. @Override
  226. public CustomerOrganizationDetailBo findOrganizationCustomerDetail(String uid) {
  227. return userMapper.findOrganizationCustomerDetail(uid);
  228. }
  229. @Override
  230. @Transactional
  231. public int updateOrganizationCustomer(CustomerOrganizationDetailBo bo) {
  232. OrganizationIdentity oi = new OrganizationIdentity();
  233. User user = new User();
  234. try {
  235. BeanUtilsExt.copyProperties(oi, bo);
  236. user.setId(bo.getUid());
  237. user.setIdentifyName(bo.getUnitName());
  238. user.setSocietyTag(bo.getSocietyTag());
  239. user.setCompanyLogoUrl(bo.getCompanyLogoUrl());
  240. user.setIntroduction(bo.getIntroduction());
  241. user.setUpdateTime(new Date());
  242. } catch (IllegalAccessException e) {
  243. e.printStackTrace();
  244. } catch (InvocationTargetException e) {
  245. e.printStackTrace();
  246. }
  247. organizationIdentityMapper.updateByPrimaryKeySelective(oi);
  248. userMapper.updateByPrimaryKeySelective(user);
  249. return 1;
  250. }
  251. @SuppressWarnings("unchecked")
  252. @Override
  253. public Pagination<FollowListBo> listFollowHistory(Integer pageNo, Integer pageSize,String uid,String businessGlossoryId) {
  254. Map<String, Object> params = new HashMap<String, Object>();
  255. if(StringUtils.isNotBlank(uid))params.put("uid", uid);
  256. if(StringUtils.isNotBlank(businessGlossoryId)) params.put("businessGlossoryId", businessGlossoryId);
  257. return (Pagination<FollowListBo>)findPage("selectFollowHistoryList","selectFollowHistoryCount",params, pageNo, pageSize);
  258. }
  259. @Override
  260. public User findUserAccountDetail(String uid) {
  261. return userMapper.findUserAccountDetail(uid);
  262. }
  263. @Override
  264. public int updateUserAccount(User user) {
  265. return userMapper.updateByPrimaryKeySelective(user);
  266. }
  267. @Override
  268. public List<OrganizationContactBook> findCustomerContacts(String uid) {
  269. return userMapper.findCustomerContacts(uid,TokenManager.getAdminId());
  270. }
  271. @Override
  272. @Transactional
  273. public int addFollow(FollowBusinessBo fbb) throws ParseException {
  274. if(fbb.getUserBusinessList().size()<1) throw new BusinessException(new Error("至少需要填一个跟进业务"));
  275. //更新跟进记录表
  276. SimpleDateFormat format = new SimpleDateFormat(AFTConstants.YYYYMMDDHHMMSS);
  277. UserFollow userFollow = new UserFollow();
  278. String followId = UUID.randomUUID().toString();
  279. userFollow.setId(followId);
  280. userFollow.setAid(TokenManager.getAdminId());
  281. userFollow.setContactType(Integer.parseInt(fbb.getContactType()));
  282. userFollow.setEffective(0);
  283. userFollow.setCreateTime(format.parse(fbb.getFollowTime()));
  284. userFollow.setOcbId(fbb.getOcbId());
  285. userFollow.setResult(fbb.getResult());
  286. userFollow.setUid(fbb.getUid());
  287. int followCount = userBusinessMapper.judgeBusiness(fbb.getUid(), null, TokenManager.getAdminId()) + 1;
  288. userFollow.setFollowCount(followCount);
  289. userFollowMapper.insert(userFollow);
  290. String ufbId = "";
  291. UserBusiness userBusiness = null;
  292. UserFollowBusiness userFollowBusiness = null;
  293. for(UserBusiness ub: fbb.getUserBusinessList()){
  294. userBusiness = new UserBusiness();
  295. userFollowBusiness = new UserFollowBusiness();
  296. ufbId = UUID.randomUUID().toString();
  297. if(StringUtils.isNotBlank(ub.getId())){
  298. //更新业务表
  299. userBusiness.setId(ub.getId());
  300. userBusiness.setBusinessGlossoryId(ub.getBusinessGlossoryId());
  301. userBusiness.setCustomerStatus(ub.getCustomerStatus());
  302. userBusiness.setFollowSituation(ub.getFollowSituation());
  303. userBusiness.setUid(fbb.getUid());
  304. userBusiness.setUpdateTime(format.parse(fbb.getFollowTime()));
  305. userBusiness.setAid(TokenManager.getAdminId());
  306. userBusinessMapper.updateByPrimaryKeySelective(userBusiness);
  307. //更新业务中间表
  308. userFollowBusiness.setBusinessId(ub.getId());
  309. userFollowBusiness.setCustomerStatus(ub.getCustomerStatus());
  310. userFollowBusiness.setFollowSituation(ub.getFollowSituation());
  311. userFollowBusiness.setId(ufbId);
  312. userFollowBusiness.setFollowId(followId);
  313. userFollowBusiness.setRemarks(ub.getRemarks());
  314. userFollowBusiness.setBusinessGlossoryId(ub.getBusinessGlossoryId());
  315. userFollowBusinessMapper.insert(userFollowBusiness);
  316. }else{
  317. //检测是否可以创建业务
  318. if(userBusinessMapper.judgeBusiness(fbb.getUid(), ub.getBusinessGlossoryId(), "")>0){
  319. String businessName = businessGlossoryMapper.selectByPrimaryKey(ub.getBusinessGlossoryId()).getName();
  320. throw new BusinessException(new Error(businessName+" 已经被跟进"));
  321. }
  322. String ubId = UUID.randomUUID().toString();
  323. //更新业务表
  324. userBusiness.setId(ubId);
  325. userBusiness.setBusinessGlossoryId(ub.getBusinessGlossoryId());
  326. userBusiness.setCreateTime(format.parse(fbb.getFollowTime()));
  327. userBusiness.setCustomerStatus(ub.getCustomerStatus());
  328. userBusiness.setFollowSituation(ub.getFollowSituation());
  329. userBusiness.setUid(fbb.getUid());
  330. userBusiness.setUpdateTime(format.parse(fbb.getFollowTime()));
  331. userBusiness.setAid(TokenManager.getAdminId());
  332. userBusinessMapper.insert(userBusiness);
  333. //更新业务中间表
  334. userFollowBusiness.setBusinessId(ubId);
  335. userFollowBusiness.setCustomerStatus(ub.getCustomerStatus());
  336. userFollowBusiness.setFollowSituation(ub.getFollowSituation());
  337. userFollowBusiness.setId(ufbId);
  338. userFollowBusiness.setFollowId(followId);
  339. userFollowBusiness.setRemarks(ub.getRemarks());
  340. userFollowBusiness.setBusinessGlossoryId(ub.getBusinessGlossoryId());
  341. userFollowBusinessMapper.insert(userFollowBusiness);
  342. }
  343. }
  344. return 1;
  345. }
  346. @Override
  347. public FollowBusinessBo findFollowById(String followId) {
  348. return userMapper.findFollowById(followId);
  349. }
  350. @Override
  351. public List<UserBusiness> findBusinessByFollowId(String followId) {
  352. return userMapper.findBusinessByFollowId(followId);
  353. }
  354. @Override
  355. @Transactional
  356. public int updateFollow(FollowBusinessBo fbb) throws ParseException {
  357. UserFollow userFollow = new UserFollow();
  358. SimpleDateFormat format = new SimpleDateFormat(AFTConstants.YYYYMMDDHHMMSS);
  359. if(StringUtils.isNotBlank(fbb.getOcbId())) userFollow.setOcbId(fbb.getOcbId());
  360. userFollow.setResult(fbb.getResult());
  361. userFollow.setContactType(Integer.parseInt(fbb.getContactType()));
  362. userFollowMapper.updateByPrimaryKeySelective(userFollow); //修改拜访记录表
  363. UserFollowBusiness userFollowBusiness = null;
  364. for(UserBusiness ub: fbb.getUserBusinessList()){
  365. userFollowBusiness = new UserFollowBusiness();
  366. if(StringUtils.isNotBlank(ub.getId())){
  367. userFollowBusiness.setId(ub.getId());
  368. userFollowBusiness.setFollowSituation(ub.getFollowSituation());
  369. userFollowBusiness.setCustomerStatus(ub.getCustomerStatus());
  370. userFollowBusiness.setRemarks(ub.getRemarks());
  371. userFollowBusinessMapper.updateByPrimaryKeySelective(userFollowBusiness); //修改拜访记录中间表
  372. }else{
  373. //检测是否可以创建业务
  374. if(userBusinessMapper.judgeBusiness(fbb.getUid(), ub.getBusinessGlossoryId(), "")>0){
  375. String businessName = businessGlossoryMapper.selectByPrimaryKey(ub.getBusinessGlossoryId()).getName();
  376. throw new BusinessException(new Error(businessName+" 已经被跟进"));
  377. }
  378. String ubId = UUID.randomUUID().toString();
  379. UserBusiness userBusiness = new UserBusiness();
  380. //更新业务表
  381. userBusiness.setId(ubId);
  382. userBusiness.setBusinessGlossoryId(ub.getBusinessGlossoryId());
  383. userBusiness.setCreateTime(format.parse(fbb.getFollowTime()));
  384. userBusiness.setCustomerStatus(ub.getCustomerStatus());
  385. userBusiness.setFollowSituation(ub.getFollowSituation());
  386. userBusiness.setUid(fbb.getUid());
  387. userBusiness.setUpdateTime(format.parse(fbb.getFollowTime()));
  388. userBusiness.setAid(TokenManager.getAdminId());
  389. userBusinessMapper.insert(userBusiness);
  390. //更新业务中间表
  391. String ufbId = UUID.randomUUID().toString();
  392. userFollowBusiness.setBusinessId(ubId);
  393. userFollowBusiness.setCustomerStatus(ub.getCustomerStatus());
  394. userFollowBusiness.setFollowSituation(ub.getFollowSituation());
  395. userFollowBusiness.setId(ufbId);
  396. userFollowBusiness.setFollowId(fbb.getFollowId());
  397. userFollowBusiness.setRemarks(ub.getRemarks());
  398. userFollowBusiness.setBusinessGlossoryId(ub.getBusinessGlossoryId());
  399. userFollowBusinessMapper.insert(userFollowBusiness);
  400. }
  401. }
  402. return 1;
  403. }
  404. @Override
  405. public Set<OrganizationContactBook> findAllContacts(String uid) {
  406. Set<OrganizationContactBook> result = new HashSet<OrganizationContactBook>();
  407. result.addAll(userMapper.findAllContacts(uid));
  408. return result;
  409. }
  410. }