写的代码小有成就+今日总结--购买产品---20200508
今日经验:
1、transPurchase.setDueRate(new BigDecimal(transPurchase2.getDueRate()));//将string转换为BigDecimal
2、Date formatBankTradeTime = DateUtil.strConvertToDate(transPurchase2.getBankTradeTime());// string转换为Date,引用DateUtil.工具类
3、DateUtil.工具类
1 package com.qinjia.finance.base.util; 2 3 import org.apache.commons.lang.StringUtils; 4 5 import java.text.DateFormat; 6 import java.text.ParseException; 7 import java.text.SimpleDateFormat; 8 import java.util.Calendar; 9 import java.util.Date; 10 import java.util.HashMap; 11 import java.util.Map; 12 13 14 /** 15 * 日期相关操作 16 */ 17 public class DateUtil { 18 19 20 private static DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 21 22 public final static String STYLE_1 = "yyyy-MM-dd HH:mm:ss"; 23 24 public final static String STYLE_2 = "yyyy-MM-dd"; 25 26 public final static String STYLE_3 = "yyyyMMdd"; 27 28 public final static String STYLE_4 = "yyyyMMddhh"; 29 30 public final static String STYLE_5 = "yyyyMMddhhmmss"; 31 32 public final static String STYLE_6 = "yyyy年MM月dd日HH时mm分ss秒"; 33 34 public final static String STYLE_7 = "yyyy年MM月dd日HH时mm分"; 35 36 public final static String STYLE_8 = "yyyy年MM月dd日"; 37 38 public final static String STYLE_9 = "hhmmss"; 39 40 public final static String STYLE_10 = "yyyyMMddHHmmss"; 41 42 //ISO8601格式时间 例如2019-12-17T10:34:00+0800 43 public final static String STYLE_11="yyyy-MM-dd'T'HH:mm:ssZZ"; 44 45 //ISO8601格式时间 例如2019-12-17T10:34:00+08:00 46 public final static String STYLE_12="yyyy-MM-dd'T'HH:mm:ssXXX"; 47 48 private static Map<String, SimpleDateFormat> sdfMap=new HashMap<String, SimpleDateFormat>(); 49 50 static{ 51 sdfMap.put(STYLE_1, new SimpleDateFormat(STYLE_1)); 52 sdfMap.put(STYLE_2, new SimpleDateFormat(STYLE_2)); 53 sdfMap.put(STYLE_3, new SimpleDateFormat(STYLE_3)); 54 sdfMap.put(STYLE_4, new SimpleDateFormat(STYLE_4)); 55 sdfMap.put(STYLE_5, new SimpleDateFormat(STYLE_5)); 56 sdfMap.put(STYLE_6, new SimpleDateFormat(STYLE_6)); 57 sdfMap.put(STYLE_7, new SimpleDateFormat(STYLE_7)); 58 sdfMap.put(STYLE_8, new SimpleDateFormat(STYLE_8)); 59 sdfMap.put(STYLE_9, new SimpleDateFormat(STYLE_9)); 60 sdfMap.put(STYLE_10, new SimpleDateFormat(STYLE_10)); 61 } 62 63 public static String getCurrentTime() { 64 return sdfMap.get(STYLE_5).format(new Date()); 65 } 66 67 /** 68 *获取当前时间字符串yyyyMMddhhmmss 69 */ 70 public static String getNowString() { 71 return sdfMap.get(STYLE_10).format(new Date()); 72 } 73 public static String getCurrentTime(String str) { 74 return sdfMap.get(str).format(new Date()); 75 } 76 77 public static String getCurrentTime(String str,String date) { 78 return sdfMap.get(str).format(strConvertToDate(date)); 79 } 80 81 /** 82 * 获取当前时间 83 * 方法描述 84 * @return 85 */ 86 public static String getNowDate(){ 87 return sdf.format(new Date()); 88 } 89 90 /** 91 * 字符串类型转化为日期类型 92 * @param str 93 * @return 94 */ 95 public static Date strConvertToDate(String str){ 96 if(StringUtils.isNotEmpty(str)){ 97 try { 98 return sdf.parse(str); 99 } catch (ParseException e) { 100 // TODO Auto-generated catch block 101 e.printStackTrace(); 102 } 103 } 104 return null; 105 } 106 107 /** 108 * 日期类型转化为制定的日期格式 109 * @param date 110 * @return 111 */ 112 public static Date dateConvertToDate(Date date){ 113 String str= sdf.format(date); 114 try { 115 return sdf.parse(str); 116 } catch (ParseException e) { 117 // TODO Auto-generated catch block 118 e.printStackTrace(); 119 } 120 return date; 121 } 122 /** 123 * 比较时间大小 124 * 125 * @param beginDate 开始时间 126 * @param endDate 结束时间 127 * @return true begin大于end 128 */ 129 public static boolean datecompare(Date beginDate,Date endDate){ 130 try{ 131 if(beginDate==null || endDate==null){ 132 return false; 133 } 134 if(beginDate.getTime()>=endDate.getTime()){ 135 return true; 136 } 137 138 }catch(Exception e){ 139 e.printStackTrace(); 140 } 141 return false; 142 } 143 /** 144 * 判断number是不是在两者之间 145 * @author wu.yy 146 * 147 * @param number 148 * @param start 149 * @param end 150 * @return 151 */ 152 public static boolean during(int number,int start,int end){ 153 if(number>=start && number<end){ 154 return true; 155 } 156 return false; 157 } 158 /** 159 * 根据不同的类别获取相应的统计格式 160 * @param lb 类别 kk_day 天 kk_month月 kk_jd季度 kk_year年kk_kk 卡口 161 * @param code 类别相应的编码值 162 * @param beginDate 开始时间 163 * @param endDate 结束时间 164 * @return map对象 165 */ 166 public static Map<String, Object> getTimeByLb(String lb,String code,String beginDate,String endDate){ 167 Map<String, Object> map = new HashMap<String, Object>(); 168 if(StringUtils.isBlank(lb)){ 169 map.put("code", "to_char(t.pass_time,'yyyy-mm-dd')"); 170 map.put("beginDate", "trunc(sysdate-7)"); 171 map.put("endDate", "trunc(sysdate-1)"); 172 }else if("kk_day".equalsIgnoreCase(lb)){ 173 map.put("code", "to_char(t.pass_time,'yyyy-mm-dd')"); 174 if("0".equalsIgnoreCase(code)){ 175 map.put("beginDate", "trunc(sysdate-7)"); 176 map.put("endDate", "trunc(sysdate-1)"); 177 }else if("1".equalsIgnoreCase(code)){ 178 map.put("beginDate", "trunc(add_months(sysdate,-1))"); 179 map.put("endDate", "trunc(sysdate-1)"); 180 }else if("2".equalsIgnoreCase(code)){ 181 if(StringUtils.isNotBlank(beginDate)){ 182 map.put("beginDate","to_date('"+beginDate+"','yyyy-mm-dd')"); 183 } 184 if(StringUtils.isNotBlank(endDate)){ 185 map.put("endDate", "to_date('"+endDate+"','yyyy-mm-dd')"); 186 } 187 } 188 return map; 189 }else if("kk_month".equalsIgnoreCase(lb)){ 190 map.put("code", "to_char(t.pass_time,'yyyy-mm')"); 191 if("0".equalsIgnoreCase(code)){ 192 map.put("beginDate", "trunc(add_months(sysdate,-3))"); 193 map.put("endDate", "trunc(sysdate-1)"); 194 }else if("1".equalsIgnoreCase(code)){ 195 map.put("beginDate", "trunc(add_months(sysdate,-6))"); 196 map.put("endDate", "trunc(sysdate-1)"); 197 }else if("2".equalsIgnoreCase(code)){ 198 map.put("beginDate", "trunc(add_months(sysdate,-12))"); 199 map.put("endDate", "trunc(sysdate-1)"); 200 }else if("3".equalsIgnoreCase(code)){ 201 if(StringUtils.isNotBlank(beginDate)){ 202 map.put("beginDate","to_date('"+beginDate+"-01-01','yyyy-mm-dd')"); 203 map.put("endDate", "to_date('"+beginDate+"-12-31','yyyy-mm-dd')"); 204 } 205 } 206 return map; 207 }else if("kk_jd".equalsIgnoreCase(lb)){ 208 map.put("code", "to_char(t.pass_time,'Q')"); 209 map.put("bswq", beginDate); 210 if("0".equalsIgnoreCase(code)){ 211 if(StringUtils.isNotBlank(beginDate)){ 212 map.put("beginDate","to_date('"+beginDate+"-01-01','yyyy-mm-dd')"); 213 map.put("endDate", "to_date('"+beginDate+"-12-31','yyyy-mm-dd')"); 214 } 215 } 216 return map; 217 }else if("kk_year".equalsIgnoreCase(lb)){ 218 map.put("code", "to_char(t.pass_time,'yyyy')"); 219 map.put("bswy", beginDate); 220 if("0".equalsIgnoreCase(code)){ 221 if(StringUtils.isNotBlank(beginDate)){ 222 map.put("beginDate","to_date('"+beginDate+"-01-01','yyyy-mm-dd')"); 223 } 224 if(StringUtils.isNotBlank(endDate)){ 225 map.put("endDate", "to_date('"+endDate+"-12-31','yyyy-mm-dd')"); 226 } 227 } 228 return map; 229 }else if("kk_kk".equalsIgnoreCase(lb)){ 230 map.put("code", "pass_port_name"); 231 if("0".equalsIgnoreCase(code)){ 232 map.put("beginDate", "trunc(sysdate-7)"); 233 map.put("endDate", "trunc(sysdate-1)"); 234 }else if("1".equalsIgnoreCase(code)){ 235 map.put("beginDate", "trunc(add_months(sysdate,-1))"); 236 map.put("endDate", "trunc(sysdate-1)"); 237 }else if("2".equalsIgnoreCase(code)){ 238 map.put("beginDate", "trunc(add_months(sysdate,-3))"); 239 map.put("endDate", "trunc(sysdate-1)"); 240 }else if("3".equalsIgnoreCase(code)){ 241 map.put("beginDate", "trunc(add_months(sysdate,-6))"); 242 map.put("endDate", "trunc(sysdate-1)"); 243 }else if("4".equalsIgnoreCase(code)){ 244 map.put("beginDate", "trunc(add_months(sysdate,-12))"); 245 map.put("endDate", "trunc(sysdate-1)"); 246 }else if("5".equalsIgnoreCase(code)){ 247 if(StringUtils.isNotBlank(beginDate)){ 248 map.put("beginDate","to_date('"+beginDate+"-01-01','yyyy-mm-dd')"); 249 } 250 if(StringUtils.isNotBlank(endDate)){ 251 map.put("endDate", "to_date('"+endDate+"-12-31','yyyy-mm-dd')"); 252 } 253 }else if("6".equalsIgnoreCase(code)){ 254 map.put("beginDate","to_date('"+beginDate+"-"+((Integer.parseInt(endDate)-1)*3+1)+"-01','yyyy-mm-dd')"); 255 map.put("endDate", "to_date('"+beginDate+"-"+(Integer.parseInt(endDate)*3)+"-"+getDayByMonth(String.valueOf(Integer.parseInt(endDate)*3))+"','yyyy-mm-dd')"); 256 }else if("7".equalsIgnoreCase(code)){ 257 map.put("beginDate","to_date('"+beginDate+"-"+endDate+"-01','yyyy-mm-dd')"); 258 map.put("endDate", "to_date('"+beginDate+"-"+endDate+"-"+getDayByMonth(endDate)+"','yyyy-mm-dd')"); 259 }else if("8".equalsIgnoreCase(code)){ 260 if(StringUtils.isNotBlank(beginDate)){ 261 map.put("beginDate","to_date('"+beginDate+"','yyyy-mm-dd')"); 262 } 263 if(StringUtils.isNotBlank(endDate)){ 264 map.put("endDate", "to_date('"+endDate+"','yyyy-mm-dd')"); 265 } 266 } 267 return map; 268 } 269 return map; 270 } 271 /** 272 * 根据当前月份获取该月最后一天日期 273 * @param month 月份 274 * @return 该月最后一天日期 275 */ 276 private static String getDayByMonth(String month){ 277 if("2".equalsIgnoreCase(month)){ 278 return "28"; 279 }else if("1".equalsIgnoreCase(month) || "3".equalsIgnoreCase(month) || "5".equalsIgnoreCase(month) || "7".equalsIgnoreCase(month) || "8".equalsIgnoreCase(month) || "10".equalsIgnoreCase(month) || "12".equalsIgnoreCase(month)){ 280 return "31"; 281 }else{ 282 return "30"; 283 } 284 } 285 286 /** 287 * 获取当前日期前一天 288 * @return date 289 */ 290 public static Date getLastDay(){ 291 Calendar calendar = Calendar.getInstance(); 292 calendar.add(Calendar.DATE, -1); //得到前一天 293 Date date = calendar.getTime(); 294 return date; 295 } 296 297 /** 298 * 获取当前日期前两天 299 * @return date 300 */ 301 public static Date getLastTwoDay(){ 302 Calendar calendar = Calendar.getInstance(); 303 calendar.add(Calendar.DATE, -2); //得到前一天 304 Date date = calendar.getTime(); 305 return date; 306 } 307 308 309 /** 310 * 获取当前日期前n天 311 * @return date 312 */ 313 public static Date getLast(int day){ 314 Calendar calendar = Calendar.getInstance(); 315 calendar.add(Calendar.DATE, -day); //得到前一天 316 Date date = calendar.getTime(); 317 return date; 318 } 319 320 /** 321 * 获取当前日期后n天 322 * @return date 323 */ 324 public static Date getLastDay(Date date1 ,int days){ 325 Calendar calendar = Calendar.getInstance(); 326 calendar.setTime(date1); 327 calendar.add(Calendar.DATE, -days); //得到前一天 328 Date date = calendar.getTime(); 329 return date; 330 } 331 332 /** 333 * 格式化日期 334 * @param format 335 * @return 336 */ 337 public static String formatDate(String format){ 338 SimpleDateFormat sFormat = new SimpleDateFormat(format); 339 return sFormat.format(new Date()); 340 } 341 342 /** 343 * 格式化日期 344 * @param format 345 * @return 346 */ 347 public static String formatDate(Date date,String format){ 348 SimpleDateFormat sFormat = new SimpleDateFormat(format); 349 return sFormat.format(date); 350 } 351 /** 352 * 时间格式化为:yyyyMMddHHmmss 353 * @param date 354 * @return 返回已格式化的字符串 355 */ 356 public static String getDateString(Date date){ 357 SimpleDateFormat s = new SimpleDateFormat("yyyyMMddHHmmss"); 358 return s.format(date); 359 } 360 /** 361 * 判断验证码是否失效 362 * @param date1 : 数据库中的时间 363 * @param code:数据字典中的子健code 364 * @return false 失效 true 未失效 365 * @throws HsException 366 */ 367 public static Boolean isDateBig(String date1,String errortime) throws Exception{ 368 SimpleDateFormat s = new SimpleDateFormat("yyyyMMddHHmmss"); 369 Date date = s.parse(date1);//将已格式化的时间字符串转成时间格式 370 long dataBaseTame = date.getTime();//将具体时间转成毫秒数 371 //将修改时间加上数据字典中配置的参数 372 long secon = Integer.parseInt(errortime)*1000 + dataBaseTame; 373 Date nowDate = new Date();//获取当前时间 374 long nowDateTime = nowDate.getTime();//将具体时间转成毫秒数 375 if(secon < nowDateTime){ //判断验证码是否已失效 376 return false; 377 } 378 return true; 379 } 380 /** 381 * 将yyyy年MM月dd天格式的时间字符串转为yyyymmdd格式 382 * @param date 383 * @return 返回已格式化的字符串 384 * @throws HsException 385 */ 386 public static String changeDate(String str) throws Exception{ 387 SimpleDateFormat s = new SimpleDateFormat("yyyy年MM月dd日"); 388 Date date = s.parse(str); 389 return getDateString(date); 390 } 391 /** 392 * 将yyyy年MM月dd天格式的时间字符串转为yyyymmdd格式 393 * @param date 394 * @return 返回已格式化的字符串 395 * @throws HsException 396 */ 397 public static String changeDates(String str) throws Exception{ 398 SimpleDateFormat s = new SimpleDateFormat("yyyyMMdd"); 399 SimpleDateFormat s1 = new SimpleDateFormat("yyyy年MM月dd日 "); 400 str = str.substring(0, 8); 401 Date date = s.parse(str); 402 return s1.format(date); 403 } 404 405 /** 406 * 将yyyy-MM-dd HH:mm:ss 时间格式转换为 yyyyMMddHHmmss格式 407 * @param str 时间格式字符串,格式为yyyy-MM-dd HH:mm:ss 408 * @return 409 * @throws Exception 410 */ 411 public static String changeDatesString(String str) throws Exception{ 412 SimpleDateFormat sdfStyle1 = sdfMap.get(STYLE_1); 413 SimpleDateFormat sdfStyle10 = sdfMap.get(STYLE_10); 414 return sdfStyle10.format(sdfStyle1.parse(str)); 415 416 } 417 /** 418 * 判断用户输入密码错误不能登录时间是否已过 419 * @param date1 : 数据库中用户密码输入错误时间 420 * @param code:数据字典中的子健code 421 * @return false 锁定时间内 true 锁定时间外 422 * @throws HsException 423 */ 424 public static Boolean isErrorTime(String date1,String code,String limtime) throws Exception{ 425 SimpleDateFormat s = new SimpleDateFormat("yyyyMMddHHmmss"); 426 Date date = s.parse(date1);//将已格式化的时间字符串转成时间格式 427 long dataBaseTame = date.getTime();//将具体时间转成毫秒数 428 //将修改时间加上数据字典中配置的参数 429 long secon = Integer.parseInt(limtime)*1000 + dataBaseTame; 430 Date nowDate = new Date();//获取当前时间 431 long nowDateTime = nowDate.getTime();//将具体时间转成毫秒数 432 if(secon > nowDateTime){ //判断用户是否在锁定时间内 433 return false; 434 } 435 return true; 436 } 437 438 439 /** 440 * 获取当前日期前两天 441 * @return date 442 */ 443 public static Date getLastMouth(Date date1 ,int mouth){ 444 Calendar calendar = Calendar.getInstance(); 445 calendar.setTime(date1); 446 calendar.add(Calendar.MONTH, mouth); //得到前一天 447 Date date = calendar.getTime(); 448 return date; 449 } 450 451 /** 452 * 字符串类型转化为日期类型 453 * @param str 454 * @return 455 */ 456 public static Date strConvertToDate2(String str1,String str){ 457 if(StringUtils.isNotEmpty(str)){ 458 try { 459 return sdfMap.get(str1).parse(str); 460 } catch (ParseException e) { 461 // TODO Auto-generated catch block 462 e.printStackTrace(); 463 } 464 } 465 return null; 466 } 467 468 /** 469 * 将时间戳转换成时间格式 470 * example:1499137275926 to 20170704110115 471 * @param timeStamp 472 * @return 473 */ 474 public static String timestampToDateStr(long timeStamp){ 475 SimpleDateFormat sdf = sdfMap.get(STYLE_10); 476 Date date = new Date(timeStamp); 477 return sdf.format(date); 478 } 479 480 /** 481 * 将 yyyyMMddHHmmss 时间格式转换为yyyy-MM-dd HH:mm:ss格式 482 * @param str 时间格式字符串,格式为yyyyMMddHHmmss 483 * @return 484 * @throws Exception 485 */ 486 public static String dateFormat(String str) throws Exception{ 487 SimpleDateFormat sdfStyle1 = sdfMap.get(STYLE_1); 488 SimpleDateFormat sdfStyle10 = sdfMap.get(STYLE_10); 489 return sdfStyle1.format(sdfStyle10.parse(str)); 490 } 491 492 /** 493 * 日期增加月份部分 494 * 495 * @param date 496 * @param amount 497 * @return 498 */ 499 public static Date addMonth(Date date, int amount) { 500 return add(date, Calendar.MONTH, amount); 501 } 502 503 /** 504 * 日期增加分钟部分 505 * 506 * @param date 507 * @param amount 508 * @return 509 */ 510 public static Date addMiunte(Date date, int amount) { 511 return add(date, Calendar.MINUTE, amount); 512 } 513 514 public static Date add(Date date, int field, int amount) { 515 if (date == null) { 516 date = new Date(); 517 } 518 519 Calendar cal = Calendar.getInstance(); 520 cal.setTime(date); 521 cal.add(field, amount); 522 523 return cal.getTime(); 524 } 525 526 527 /** 528 * 判断当前时间是否在[startTime, endTime]区间,注意时间格式要一致 529 * 530 * @param nowTime 531 * 当前时间 532 * @param startTime 533 * 开始时间 534 * @param endTime 535 * 结束时间 536 * @return 537 */ 538 public static boolean isEffectiveDate(Date nowTime, Date startTime, Date endTime) { 539 if (nowTime.getTime() == startTime.getTime() || nowTime.getTime() == endTime.getTime()) { 540 return true; 541 } 542 543 Calendar date = Calendar.getInstance(); 544 date.setTime(nowTime); 545 546 Calendar begin = Calendar.getInstance(); 547 begin.setTime(startTime); 548 549 Calendar end = Calendar.getInstance(); 550 end.setTime(endTime); 551 552 if (date.after(begin) && date.before(end)) { 553 return true; 554 } else { 555 return false; 556 } 557 } 558 559 /** 560 * 返回两个日期的相隔天数 561 * @param startDate 562 * @param endDate 563 * @return 564 */ 565 public static Long getDaysBetween(Date startDate, Date endDate) { 566 Calendar fromCalendar = Calendar.getInstance(); 567 fromCalendar.setTime(startDate); 568 fromCalendar.set(Calendar.HOUR_OF_DAY, 0); 569 fromCalendar.set(Calendar.MINUTE, 0); 570 fromCalendar.set(Calendar.SECOND, 0); 571 fromCalendar.set(Calendar.MILLISECOND, 0); 572 573 Calendar toCalendar = Calendar.getInstance(); 574 toCalendar.setTime(endDate); 575 toCalendar.set(Calendar.HOUR_OF_DAY, 0); 576 toCalendar.set(Calendar.MINUTE, 0); 577 toCalendar.set(Calendar.SECOND, 0); 578 toCalendar.set(Calendar.MILLISECOND, 0); 579 580 return (toCalendar.getTime().getTime() - fromCalendar.getTime().getTime()) / (1000 * 60 * 60 * 24); 581 } 582 583 584 /** 585 * 获取某月的最后一天 586 * 587 */ 588 public static Date getLastDayOfMonth(int year,int month) 589 { 590 Calendar cal = Calendar.getInstance(); 591 //设置年份 592 cal.set(Calendar.YEAR,year); 593 //设置月份 594 cal.set(Calendar.MONTH, month-1); 595 //获取某月最大天数 596 int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); 597 //设置日历中月份的最大天数 598 cal.set(Calendar.DAY_OF_MONTH, lastDay); 599 return cal.getTime(); 600 } 601 }
1 package com.qinjia.finance.service.impl; 2 2 3 3 import com.alibaba.fastjson.JSON; 4 4 import com.alibaba.fastjson.JSONObject; 5 5 import com.qinjia.finance.base.util.DateUtil; 6 6 import com.qinjia.finance.base.util.IdGenerator; 7 7 import com.qinjia.finance.common.constant.CommonConstant; 8 8 import com.qinjia.finance.common.util.BaoShengUtil; 9 9 import com.qinjia.finance.dto.ProductBuyRes; 10 10 import com.qinjia.finance.dto.ResponseDto; 11 11 import com.qinjia.finance.entity.*; 12 12 import com.qinjia.finance.enums.UriEnums; 13 13 import com.qinjia.finance.mapper.*; 14 14 import com.qinjia.finance.service.BsEventHandleService; 15 15 import com.qinjia.finance.service.ProductService; 16 16 import lombok.extern.log4j.Log4j2; 17 17 import org.springframework.beans.BeanUtils; 18 18 import org.springframework.beans.factory.annotation.Autowired; 19 19 import org.springframework.stereotype.Service; 20 20 import org.springframework.transaction.annotation.Transactional; 21 21 import tk.mybatis.mapper.entity.Example; 22 22 import javax.annotation.Resource; 23 23 import java.math.BigDecimal; 24 24 import java.util.Date; 25 25 import java.util.List; 26 26 27 27 /** 28 28 * 5.3购买产品接口 29 29 */ 30 30 @Service("productBuyService") 31 31 @Log4j2 32 32 public class ProductBuyServiceImpl implements ProductService, BsEventHandleService { 33 33 34 34 @Autowired 35 35 BaoShengUtil baoShengUtil; 36 36 @Resource 37 37 TransPurchaseMapper transPurchaseMapper; 38 38 @Resource 39 39 AcctMainMapper acctMainMapper; 40 40 @Resource 41 41 CustBaseInfoMapper custBaseInfoMapper; 42 42 @Resource 43 43 AcctSubMapper acctSubMapper; 44 44 @Resource 45 45 AcctEntryMapper acctEntryMapper; 46 46 47 47 48 48 49 49 @Override 50 50 public Object call(String serviceName, Object... object) throws Exception { 51 51 //组装请求报文 52 52 //发送宝生接口 53 53 //组装mq消息,发送 54 54 ResponseDto responseDto = baoShengUtil.messageSend(UriEnums.DBANKAPI_PROD_BUY.getUrl(),object[0]); 55 55 responseDto.configData(ProductBuyRes.class); 56 56 return responseDto; 57 57 } 58 58 59 59 @Override 60 60 @Transactional(rollbackFor = Exception.class) 61 61 public boolean handleMsg(JSONObject jsonObject) throws Exception { 62 62 /** ############### 整体逻辑 ##################### 63 63 * 1、t_trans_purchase 表增加一条购买记录(无论交易成功还是失败) 64 64 * 2、如果1交易成功,判断是否存在产品账户 t_acct_sub;同时定义全局全局变量:产品账户交易前金额(目的:交易流水记录用到) 65 65 * 2.1.1、存在:修改产品账户金额:交易前金额+交易金额;同时赋值全局变量:产品账户交易前金额 66 66 * 2.1.2、不存在:新增产品账户,产品账户金额:交易金额;全局变量:产品账户交易前金额(0.00) 67 67 * 2.2、获取存管账户 t_acct_sub,更改相关交易金额 68 68 * 3.1、t_acct_entry 增加记录:产品购买记录(余额+) 69 69 * 3.2、t_acct_entry 增加记录:账户购买记录(余额-) 70 70 */ 71 71 log.info("====处理产品购买信息===="); 72 72 //1、新增购买记录 73 73 //新增交易流水信息 74 74 String inParam = jsonObject.getString("inParam"); 75 75 String outParam = jsonObject.getString("outParam"); 76 76 TransPurchase transPurchase1 = JSON.parseObject(inParam, TransPurchase.class); 77 77 ProductBuyRes transPurchase2 = JSON.parseObject(outParam, ProductBuyRes.class); 78 78 //保存出参信息 79 79 TransPurchase transPurchase = new TransPurchase(); 80 80 BeanUtils.copyProperties(transPurchase2,transPurchase); 81 81 transPurchase.setId(Long.parseLong(IdGenerator.generateId())); 82 82 transPurchase.setFundCode(CommonConstant.FUND_NO); //资金方编号 83 83 transPurchase.setAssetNo(CommonConstant.ASSET_NO);//资产方编号 84 84 transPurchase.setTelephone(transPurchase1.getTelephone()); 85 85 transPurchase.setProductCode(transPurchase1.getProductCode()); 86 86 transPurchase.setTradeAmount(transPurchase1.getTradeAmount()); 87 87 transPurchase.setCreateTime(new Date()); 88 88 transPurchase.setUpdateTime(new Date()); 89 89 Date formatBankTradeTime = DateUtil.strConvertToDate(transPurchase2.getBankTradeTime()); 90 90 Date formatInterestBeginDate = DateUtil.strConvertToDate(transPurchase2.getInterestBeginDate()); 91 91 Date formatRedeemableDate = DateUtil.strConvertToDate(transPurchase2.getRedeemableDate()); 92 92 Date formatNextValueDate = DateUtil.strConvertToDate(transPurchase2.getNextValueDate()); 93 93 transPurchase.setRedeemableDate(formatRedeemableDate); 94 94 transPurchase.setInterestBeginDate(formatInterestBeginDate); 95 95 transPurchase.setInterestEndDate(transPurchase2.getInterestDueEndDate()); 96 96 transPurchase.setDueRate(new BigDecimal(transPurchase2.getDueRate())); 97 97 transPurchase.setDueInterestAmount(new BigDecimal(transPurchase2.getDueInterestAmount())); 98 98 transPurchase.setNextValueDate(formatNextValueDate); 99 99 transPurchase.setBankTradeTime(formatBankTradeTime); 100 100 transPurchaseMapper.insertSelective(transPurchase); 101 101 //购买成功数据落库 102 102 if("FAIL".equals(transPurchase2.getTradeStatus())){ 103 103 log.info("购买产品失败..."); 104 104 } 105 105 if("PROCESSING".equals(transPurchase2.getTradeStatus())){ 106 106 log.info("购买产品处理中..."); 107 107 } 108 108 if ("SUCCESS".equals(transPurchase2.getTradeStatus())) { 109 109 //2.1 110 110 //2.1.1、根据thirdUserId获取主账号cust_id 111 111 Example example1 = new Example(CustBaseInfo.class); 112 112 example1.createCriteria().andEqualTo("thirdUserId", transPurchase1.getThirdUserId()); 113 113 List<CustBaseInfo> custBaseInfoList = custBaseInfoMapper.selectByExample(example1); 114 114 CustBaseInfo custBaseInfo = new CustBaseInfo(); 115 115 if (!custBaseInfoList.isEmpty()) { 116 116 custBaseInfo = custBaseInfoList.get(0); 117 117 } 118 118 119 119 //2.1.2 根据cust_id和产品代码查询t_acct_sub 获取产品账户 120 120 Example example5 = new Example(AccSub.class); 121 121 example5.createCriteria().andEqualTo("custId", custBaseInfo.getId()) 122 122 .andEqualTo("acctNo", transPurchase1.getProductCode()); 123 123 List<AccSub> accSubListForProductPanDuan = acctSubMapper.selectByExample(example5); 124 124 AccSub accSubForNewOrUpdate = new AccSub(); 125 125 //2.1.3、根据thirdUserId获取主账号id 和UserName 126 126 Example example = new Example(AcctMain.class); 127 127 example.createCriteria().andEqualTo("acctNo", transPurchase1.getThirdUserId()); 128 128 List<AcctMain> acctMainList = acctMainMapper.selectByExample(example); 129 129 AcctMain acctMain = new AcctMain(); 130 130 if (!acctMainList.isEmpty()) { 131 131 acctMain = acctMainList.get(0); 132 132 } 133 133 BigDecimal productAccBalancePre = new BigDecimal(0);//定义变量:产品账户交易前余额 134 134 if (!accSubListForProductPanDuan.isEmpty()) { 135 135 // 存在,修改金额:当前金额加交易金额 136 136 accSubForNewOrUpdate = accSubListForProductPanDuan.get(0); 137 137 //2.1.4、获取交易前产品账户余额 138 138 productAccBalancePre = accSubForNewOrUpdate.getBalance(); 139 139 accSubForNewOrUpdate.setBalance(accSubForNewOrUpdate.getBalance().add(transPurchase1.getTradeAmount())); 140 140 accSubForNewOrUpdate.setUpdateTime(new Date()); 141 141 // 2.1 、或修改产品账户 142 142 acctSubMapper.updateByPrimaryKey(accSubForNewOrUpdate); 143 143 } else { 144 144 //不存在,新增产品账户 当前金额为交易金额 145 145 accSubForNewOrUpdate.setId(Long.parseLong(IdGenerator.generateId())); 146 146 accSubForNewOrUpdate.setParentId(acctMain.getId()); 147 147 accSubForNewOrUpdate.setAcctType("20"); //指定产品账户 148 148 accSubForNewOrUpdate.setAcctNo(transPurchase.getProductCode());//产品代码 149 149 accSubForNewOrUpdate.setCustId(custBaseInfo.getId()); 150 150 accSubForNewOrUpdate.setUserName(acctMain.getUserName()); 151 151 accSubForNewOrUpdate.setFundCode(CommonConstant.FUND_NO); 152 152 accSubForNewOrUpdate.setAssetNo(CommonConstant.ASSET_NO); 153 153 accSubForNewOrUpdate.setBalance(transPurchase1.getTradeAmount());//当前金额为交易金额 154 154 accSubForNewOrUpdate.setCreateTime(new Date()); 155 155 accSubForNewOrUpdate.setUpdateTime(new Date()); 156 156 // 2.1、或新增产品账户 157 157 acctSubMapper.insertSelective(accSubForNewOrUpdate); 158 158 } 159 159 // 2.2、t_acct_sub 存管户余额减少 160 160 // 2.2.1 设置查询条件:thirdUserId,10存管账户 查找存管账户 条件为:example3,结果为accSub2 161 161 Example example3 = new Example(AccSub.class); 162 162 example3.createCriteria().andEqualTo("custId", custBaseInfo.getId()) 163 163 .andEqualTo("acctType", "10");//设置查询条件:thirdUserId,10存管账户 164 164 List<AccSub> accSubList = acctSubMapper.selectByExample(example3); 165 165 AccSub accSub2 = new AccSub(); 166 166 BigDecimal accBalancePre = new BigDecimal(0); //定义变量:存管账户交易前余额 167 167 if (!accSubList.isEmpty()) { 168 168 accSub2 = accSubList.get(0); 169 169 accBalancePre = accSub2.getBalance(); 170 170 accSub2.setBalance(accSub2.getBalance().subtract(transPurchase1.getTradeAmount()));//存管账户余额为当前余额减交易金额 171 171 accSub2.setUpdateTime(new Date()); 172 172 // 2.2、t_acct_sub 存管户余额减少 173 173 acctSubMapper.updateByPrimaryKey(accSub2); 174 174 } 175 175 //3 t_acct_entry账户金额变动日志表增加两条流水 176 176 //3.1、新增一条产品账户金额增加记录 177 177 AcctEntry acctEntry = new AcctEntry(); 178 178 acctEntry.setId(Long.parseLong(IdGenerator.generateId())); 179 179 acctEntry.setSubAcctId(accSubForNewOrUpdate.getId()); 180 180 acctEntry.setOppAcctId(Long.valueOf(2));//本账户是充值,则对手方为购买(提现) 181 181 acctEntry.setPreAmt(productAccBalancePre);//产品账户交易前金额 182 182 acctEntry.setTransAmt(transPurchase1.getTradeAmount());//交易金额 183 183 acctEntry.setPostAmt(acctEntry.getPreAmt().add(acctEntry.getTransAmt()));//交易后金额=交易前金额+交易金额 184 184 acctEntry.setTransType("CZ");// 185 185 acctEntry.setTransId(transPurchase.getId()); 186 186 acctEntry.setBalance(acctEntry.getPostAmt()); 187 187 acctEntry.setCreateTime(new Date()); 188 188 acctEntry.setUpdateTime(new Date()); 189 189 acctEntryMapper.insertSelective(acctEntry); 190 190 191 191 AcctEntry acctEntry2 = new AcctEntry(); 192 192 acctEntry2.setId(Long.parseLong(IdGenerator.generateId())); 193 193 acctEntry2.setSubAcctId(accSubForNewOrUpdate.getId()); 194 194 acctEntry2.setOppAcctId(Long.valueOf(1));//本账户是购买,则对手方为充值 195 195 acctEntry2.setPreAmt(accBalancePre); 196 196 acctEntry2.setTransAmt(transPurchase1.getTradeAmount()); 197 197 acctEntry2.setPostAmt(acctEntry2.getPreAmt().subtract(acctEntry2.getTransAmt()));//交易后金额=交易前金额-交易金额 198 198 acctEntry2.setTransType("SG");//交易类型 :SG申购 199 199 acctEntry2.setTransId(transPurchase.getId()); 200 200 acctEntry2.setBalance(acctEntry2.getPostAmt()); 201 201 acctEntry2.setCreateTime(new Date()); 202 202 acctEntry2.setUpdateTime(new Date()); 203 203 acctEntryMapper.insertSelective(acctEntry2); 204 204 } 205 205 return false; 206 206 } 207 207 208 208 @Override 209 209 public UriEnums get() { 210 210 return UriEnums.DBANKAPI_PROD_BUY; 211 211 } 212 212 213 213 } 214 214 215 215 216 216 ============================
1