package com.szwl.controller;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.gexin.fastjson.JSON;
import com.szwl.feign.SzwlFeign;
import com.szwl.feign.bean.TAdminParam;
import com.szwl.model.bean.CoinOrderVO;
import com.szwl.model.bo.JsonMessage;
import com.szwl.model.bo.R;
import com.szwl.model.bo.ResponseModel;
import com.szwl.model.entity.*;
import com.szwl.model.query.OrderStatisticsDTO;
import com.szwl.model.query.Pageable;
import com.szwl.model.query.TCoinOrderParam;
import com.szwl.model.utils.JsonUtils;
import com.szwl.service.*;
import com.szwl.service.es.EsTCoinOrderService;
import com.szwl.util.HuifuUtils;
import com.szwl.util.IDGenerator;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
/**
*
* 前端控制器
*
*
* @author wuhs
* @since 2023-08-29
*/
@Slf4j
@RestController
@RequestMapping("/tCoinOrder")
public class TCoinOrderController {
@Resource
SzwlFeign szwlFeign;
@Autowired
EsTCoinOrderService esTCoinOrderService;
@Autowired
TCoinOrderService coinOrderService;
@Autowired
TOrderDetailsService orderDetailsService;
@Autowired
TNameDictionaryService nameDictionaryService;
// @Resource
// EsFeign esFeign;
@Resource
TAdminService adminService;
@Resource
TEquipmentService equipmentService;
@ApiOperation(value = "测试feign")
@GetMapping("/testFeign")
public ResponseModel testFeign(String name) {
List list = R.getDataIfSuccess(szwlFeign.testList(new TAdminParam().setName(name)));
return R.ok(list);
}
// @ApiOperation(value = "同步订单到es中")
// @PostMapping("/saveOrderAbroadToEs")
// public ResponseModel> saveToEs(@RequestBody TCoinOrder coinOrder){
// if(coinOrder==null){
// return R.fail(ResponseCodesEnum.A0001);
// }
// esFeign.saveOrderAbroadToEs(coinOrder);
// return R.ok("同步es成功");
// }
@ApiOperation(value = "上传线下/海外纸币器订单")
@PostMapping("/newSaveCoinOrder")
@ResponseBody
public Object newSaveCoinOrder(@RequestBody CoinOrderVO coinOrderVO) {
String clientId = coinOrderVO.getClientId();
String name = coinOrderVO.getName();
Integer payType = coinOrderVO.getPayType();
BigDecimal price = coinOrderVO.getPrice();
String sn = coinOrderVO.getSn();
// no: 商品名称-编号-数量,玫瑰精灵-A01-1,雪糕-I01-1
String no = coinOrderVO.getNo();
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(TCoinOrder::getSn, sn);
List coinOrders = coinOrderService.list(queryWrapper);
if (coinOrders.size() > 0) {
try {
esTCoinOrderService.insertData(coinOrders.get(0));
} catch (Exception e) {
e.printStackTrace();
}
return JsonMessage.success("添加线下订单成功");
}
TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(clientId));
String machineType = equipment.getMachineType(); // 设备类型
Long adminId = equipment.getAdminId();
if (adminId == null) {
return JsonMessage.error("找不到设备商家");
}
String adminIdStr = String.valueOf(adminId);
// 根据 adminId 获取admin信息中的公司类型
TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin(adminIdStr));
String companyType = admin.getCompanyType();
TCoinOrder coinOrder = new TCoinOrder();
coinOrder.setId(IDGenerator.coinOrderID());
coinOrder.setType(null);
coinOrder.setClientId(clientId);
coinOrder.setAdminId(adminId);
coinOrder.setProductName(name);
coinOrder.setPayType(payType);
coinOrder.setPrice(price);
coinOrder.setSn(sn);
// 线下纸币器订单都是已付款
coinOrder.setStatus(1);
// 0或null 非空中云汇
coinOrder.setIsAir("0");
coinOrder.setEquipmentId(equipment.getId());
// 保存订单明细
TOrderDetails tOrderDetails = new TOrderDetails();
tOrderDetails.setOrderSn(sn);
tOrderDetails.setEquipmentId(equipment.getId());
tOrderDetails.setRefundStatus("1");
tOrderDetails.setAdminId(adminId);
// 设备类型
if (StringUtils.isEmpty(machineType) || machineType.equals("0")) {
coinOrder.setMachineType("0");
tOrderDetails.setMachineType("0");
} else {
coinOrder.setMachineType(machineType);
tOrderDetails.setMachineType(machineType);
}
// 公司平台
if (StringUtils.isNotEmpty(companyType) && companyType.equals("1")) {
coinOrder.setCompanyType(companyType);
tOrderDetails.setCompanyType(companyType);
} else {
coinOrder.setCompanyType("0");
tOrderDetails.setCompanyType("0");
}
// 商品数量
if (coinOrderVO.getProductNumber() == null || coinOrderVO.getProductNumber() == 0) {
coinOrderVO.setProductNumber(1);
} else {
coinOrder.setProductNumber(coinOrderVO.getProductNumber());
}
if (StringUtils.isNotEmpty(coinOrderVO.getCreateDate())) {
java.text.SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date1 = null;
try {
date1 = formatter.parse(coinOrderVO.getCreateDate());
} catch (ParseException e) {
e.printStackTrace();
}
coinOrder.setCreateDate(date1);
coinOrder.setModifyDate(date1);
coinOrder.setPayDate(date1);
tOrderDetails.setCreateDate(date1);
} else {
coinOrder.setCreateDate(new Date());
coinOrder.setModifyDate(new Date());
coinOrder.setPayDate(new Date());
tOrderDetails.setCreateDate(new Date());
}
coinOrderService.save(coinOrder);
try {
String[] split = no.split(",");
for (String s : split) {
String[] strings = s.split("-");
// 商品名称
String goodName = strings[0];
// 商品编号
String goodNo = strings[1];
// 商品数量
Integer productNumber = Integer.valueOf(strings[2]);
tOrderDetails.setId(HuifuUtils.initDetailsId());
tOrderDetails.setProductNumber(productNumber);
tOrderDetails.setProductName(goodName);
tOrderDetails.setProductNo(goodNo);
orderDetailsService.save(tOrderDetails);
}
} catch (Exception e) {
e.printStackTrace();
}
try {
// 推送微信订单
// 判断是否开启订单推送功能
if (admin != null && StringUtils.isNotEmpty(admin.getOrderNotice()) && admin.getOrderNotice().equals("1")) {
String openId = R.getDataIfSuccess(szwlFeign.getOpenId(adminId));
// 获取openId
if (StringUtils.isNotEmpty(openId)) {
coinOrderService.sendWechatMessage(openId, equipment, coinOrder, admin.getCompanyType());
}
}
esTCoinOrderService.insertData(coinOrder);
} catch (Exception e) {
e.printStackTrace();
}
return JsonMessage.success("添加线下订单成功");
}
/**
* 保存 线下/海外纸币器 订单
*
* @param coinOrderVO
* @return
*/
@PostMapping("/saveCoinOrder")
@ResponseBody
public Object saveCoinOrder(@RequestBody CoinOrderVO coinOrderVO) {
String clientId = coinOrderVO.getClientId();
String name = coinOrderVO.getName();
Integer payType = coinOrderVO.getPayType();
BigDecimal price = coinOrderVO.getPrice();
String sn = coinOrderVO.getSn();
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(TCoinOrder::getSn, sn);
List coinOrders = coinOrderService.list(queryWrapper);
if (coinOrders.size() > 0) {
try {
esTCoinOrderService.insertData(coinOrders.get(0));
} catch (Exception e) {
e.printStackTrace();
}
return JsonMessage.success("添加线下订单成功");
}
TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(clientId));
String machineType = equipment.getMachineType(); // 设备类型
Long adminId = equipment.getAdminId();
if (adminId == null) {
return JsonMessage.error("找不到设备商家");
}
String adminIdStr = String.valueOf(adminId);
// 根据 adminId 获取admin信息中的公司类型
TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin(adminIdStr));
String companyType = admin.getCompanyType();
TCoinOrder coinOrder = new TCoinOrder();
coinOrder.setId(IDGenerator.coinOrderID());
coinOrder.setType(null);
coinOrder.setClientId(clientId);
coinOrder.setAdminId(adminId);
coinOrder.setProductName(name);
coinOrder.setPayType(payType);
coinOrder.setPrice(price);
coinOrder.setSn(sn);
// 线下纸币器订单都是已付款
coinOrder.setStatus(1);
// 0或null 非空中云汇
coinOrder.setIsAir("0");
coinOrder.setEquipmentId(equipment.getId());
// 保存订单明细
TOrderDetails tOrderDetails = new TOrderDetails();
tOrderDetails.setOrderSn(sn);
tOrderDetails.setEquipmentId(equipment.getId());
tOrderDetails.setRefundStatus("1");
tOrderDetails.setAdminId(adminId);
// 设备类型
if (StringUtils.isEmpty(machineType) || machineType.equals("0")) {
coinOrder.setMachineType("0");
tOrderDetails.setMachineType("0");
} else {
coinOrder.setMachineType(machineType);
tOrderDetails.setMachineType(machineType);
}
// 公司平台
if (StringUtils.isNotEmpty(companyType) && companyType.equals("1")) {
coinOrder.setCompanyType(companyType);
tOrderDetails.setCompanyType(companyType);
} else {
coinOrder.setCompanyType("0");
tOrderDetails.setCompanyType("0");
}
// 商品数量
if (coinOrderVO.getProductNumber() == null || coinOrderVO.getProductNumber() == 0) {
coinOrderVO.setProductNumber(1);
} else {
coinOrder.setProductNumber(coinOrderVO.getProductNumber());
}
if (StringUtils.isNotEmpty(coinOrderVO.getCreateDate())) {
java.text.SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date1 = null;
try {
date1 = formatter.parse(coinOrderVO.getCreateDate());
} catch (ParseException e) {
e.printStackTrace();
}
coinOrder.setCreateDate(date1);
coinOrder.setModifyDate(date1);
coinOrder.setPayDate(date1);
tOrderDetails.setCreateDate(date1);
} else {
coinOrder.setCreateDate(new Date());
coinOrder.setModifyDate(new Date());
coinOrder.setPayDate(new Date());
tOrderDetails.setCreateDate(new Date());
}
coinOrderService.save(coinOrder);
try {
if (name.contains("-")) {
HashMap map = new HashMap<>();
String[] split = name.split(",");
for (String s : split) {
String[] strings = s.split("-");
map.put(strings[0], Integer.valueOf(strings[1]));
}
for (String key : map.keySet()) {
// key:"A01",value:"1"
// 找到商品名称对应设备的商品信息
Integer productNumber = map.get(key);
tOrderDetails.setId(HuifuUtils.initDetailsId());
tOrderDetails.setProductNumber(productNumber);
tOrderDetails.setProductName(key);
TProduct product = R.getDataIfSuccess(szwlFeign.getProduct(String.valueOf(equipment.getId()), key));
if (product == null) {
// 找到对应的商品名称的字典
LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();
wrapper.eq(TNameDictionary::getName, key);
List list = nameDictionaryService.list(wrapper);
if (list.size() > 0) {
tOrderDetails.setProductNo(list.get(0).getNo());
} else {
tOrderDetails.setProductNo("A01");
}
} else {
tOrderDetails.setProductNo(product.getNo());
}
orderDetailsService.save(tOrderDetails);
}
} else {
tOrderDetails.setId(HuifuUtils.initDetailsId());
tOrderDetails.setProductName(name);
tOrderDetails.setProductNumber(1);
if (name.contains("DIY")) {
tOrderDetails.setProductNo("A99");
} else {
TProduct product = R.getDataIfSuccess(szwlFeign.getProduct(String.valueOf(equipment.getId()), name));
if (product == null) {
// 找到对应的商品名称的字典
LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();
wrapper.eq(TNameDictionary::getName, name);
List list = nameDictionaryService.list(wrapper);
if (list.size() > 0) {
tOrderDetails.setProductNo(list.get(0).getNo());
} else {
tOrderDetails.setProductNo("A01");
}
} else {
tOrderDetails.setProductNo(product.getNo());
}
}
orderDetailsService.save(tOrderDetails);
}
} catch (Exception e) {
e.printStackTrace();
}
try {
// 推送微信订单
// 判断是否开启订单推送功能
if (admin != null && StringUtils.isNotEmpty(admin.getOrderNotice()) && admin.getOrderNotice().equals("1")) {
String openId = R.getDataIfSuccess(szwlFeign.getOpenId(adminId));
// 获取openId
if (StringUtils.isNotEmpty(openId)) {
coinOrderService.sendWechatMessage(openId, equipment, coinOrder, admin.getCompanyType());
}
}
esTCoinOrderService.insertData(coinOrder);
} catch (Exception e) {
e.printStackTrace();
}
return JsonMessage.success("添加线下订单成功");
}
//设备查询线下订单记录
@RequestMapping(value = "/findCoinOrder", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
@ResponseBody
public String list(String clientId, String sn, String productName, Integer payType, Date begin, Date end, Pageable pageable) {
LambdaQueryWrapper query = Wrappers.lambdaQuery();
if (StringUtils.isNotEmpty(sn)) {
query.eq(TCoinOrder::getSn, sn);
}
if (StringUtils.isNotEmpty(productName)) {
query.eq(TCoinOrder::getProductName, productName);
}
if (payType != null) {
query.eq(TCoinOrder::getPayType, payType);
}
if (begin != null && end != null) {
query.gt(TCoinOrder::getPayDate, begin);
query.lt(TCoinOrder::getPayDate, end);
}
query.eq(TCoinOrder::getClientId, clientId);
int size = pageable.getPageSize();
int current = pageable.getPageNumber();
Page page = new Page<>(current, size, true);
IPage iPage = coinOrderService.page(page, query);
long total = page.getTotal();
JSONObject jsonObject = new JSONObject();
jsonObject.put("total", total);
jsonObject.put("coinorders", JSON.toJSONString(iPage.getRecords()));
return jsonObject.toJSONString();
}
//设备查询线下订单记录
@RequestMapping(value = "/newFindCoinOrder", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
@ResponseBody
public String newFindCoinOrder(String clientId, String sn, String productName, Integer payType, String begin, String end, Pageable pageable) {
LambdaQueryWrapper query = Wrappers.lambdaQuery();
java.text.SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date1 = null;
Date date2 = null;
try {
date1 = formatter.parse(begin);
date2 = formatter.parse(end);
} catch (ParseException e) {
e.printStackTrace();
}
if (StringUtils.isNotEmpty(sn)) {
query.eq(TCoinOrder::getSn, sn);
}
if (StringUtils.isNotEmpty(productName)) {
query.eq(TCoinOrder::getProductName, productName);
}
if (payType != null) {
query.eq(TCoinOrder::getPayType, payType);
}
if (begin != null && end != null) {
query.gt(TCoinOrder::getPayDate, begin);
query.lt(TCoinOrder::getPayDate, end);
}
query.eq(TCoinOrder::getClientId, clientId);
int size = pageable.getPageSize();
int current = pageable.getPageNumber();
Page page = new Page<>(current, size, true);
IPage iPage = coinOrderService.page(page, query);
long total = page.getTotal();
JSONObject jsonObject = new JSONObject();
jsonObject.put("total", total);
jsonObject.put("coinorders", JSON.toJSONString(iPage.getRecords()));
return jsonObject.toJSONString();
}
//设备查看线下汇总统计
@RequestMapping(value = "/listCoin", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
@ResponseBody
public Object findByTime(String clientId, String startTime, String endTime) {
java.text.SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date1 = null;
Date date2 = null;
try {
date1 = formatter.parse(startTime);
date2 = formatter.parse(endTime);
} catch (ParseException e) {
e.printStackTrace();
}
List list = coinOrderService.findTotalByTime(clientId, date1, date2);
JSONObject jsonObject = new JSONObject();
jsonObject.put("code", 0);
jsonObject.put("data", JsonUtils.toJson(list));
jsonObject.put("errmsg", "");
return jsonObject;
}
@PostMapping("/fixOrder")
public ResponseModel> fixOrder(@RequestBody TCoinOrderParam param) {
LambdaQueryWrapper query = Wrappers.lambdaQuery();
query.gt(TCoinOrder::getCreateDate, param.getCreateDate_start());
query.lt(TCoinOrder::getCreateDate, param.getCreateDate_end());
List list = coinOrderService.list(query);
ArrayList snList = new ArrayList<>();
for (TCoinOrder coinOrder : list) {
String sn = coinOrder.getSn();
if (!snList.contains(sn)) {
LambdaQueryWrapper snQuery = Wrappers.lambdaQuery();
snQuery.eq(TCoinOrder::getSn, sn);
query.gt(TCoinOrder::getCreateDate, param.getCreateDate_start());
query.lt(TCoinOrder::getCreateDate, param.getCreateDate_end());
List coinOrderList = coinOrderService.list(snQuery);
if (coinOrderList.size() > 1) {
snList.add(sn);
}
}
}
if (snList.size() > 0) {
for (String s : snList) {
try {
LambdaQueryWrapper snQuery = Wrappers.lambdaQuery();
snQuery.eq(TCoinOrder::getSn, s);
List coinOrderList = coinOrderService.list(snQuery);
if (coinOrderList.size() > 1) {
for (int i = 1; i < coinOrderList.size(); i++) {
TCoinOrder coinOrder = coinOrderList.get(i);
Long id = coinOrder.getId();
coinOrderService.removeById(id);
esTCoinOrderService.deleteTableById(String.valueOf(id));
}
}
} catch (Exception e) {
log.error("ElasticsearchRunner deleteData 发生错误:{}", e);
}
}
}
return R.ok(snList);
}
}