Explorar o código

小程序订单支付回调、web出库任务派工增加消息推送

liyuan hai 19 horas
pai
achega
bfbdabfe1d

+ 5 - 0
blade-common/src/main/java/org/springblade/common/enums/CommonEnum.java

@@ -83,6 +83,11 @@ public enum CommonEnum {
 	 */
 	GET_DATA_FAIL("获取数据失败"),
 
+	/**
+	 * 下单通知内容
+	 */
+	ORDER_CONTENT_MSG("订单号:%s\n客户名:%s\n业务员:%s\n订单信息:%s"),
+
 
 	/**
 	 * 中文分隔符号

+ 5 - 0
blade-common/src/main/java/org/springblade/common/enums/NumberEnum.java

@@ -72,6 +72,11 @@ public enum NumberEnum {
 	FIFTEEN(15),
 
 	/**
+	 * 50
+	 */
+	FIFTY(50),
+
+	/**
 	 * 500
 	 */
 	FIVE_HUNDRED(500),

+ 32 - 0
blade-service-api/blade-payment-api/src/main/java/org/springblade/pay/tonglianPayment/vo/PushAppMsgVo.java

@@ -0,0 +1,32 @@
+package org.springblade.pay.tonglianPayment.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author Rain
+ */
+@Data
+public class PushAppMsgVo {
+
+
+	private List<Long> userIdList;
+
+
+	/**
+	 * 推送的标题
+	 * 注意:最多二十个字符
+	 */
+	private String title;
+
+	/**
+	 * 推送的内容
+	 * 注意:最多五十个字符
+	 * 换行使用换行符 \n
+	 */
+	private String content;
+
+	private Long orderId;
+
+}

+ 12 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/feign/IPJOrderClient.java

@@ -1,6 +1,7 @@
 package org.springblade.salesPart.feign;
 
 import org.springblade.core.tool.api.R;
+import org.springblade.pay.tonglianPayment.vo.PushAppMsgVo;
 import org.springblade.salesPart.entity.PjOrder;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -34,6 +35,8 @@ public interface IPJOrderClient {
 	String UNDER_REVIEW_RW = API_PREFIX + "/underReviewRW";
 	String PASS_CANCEL_RW = API_PREFIX + "/passCancelRW";
 
+	String PUSH_APP_MSG = API_PREFIX + "/pushAppMsg";
+
 
 	/**
 	 * 修改订单
@@ -133,4 +136,13 @@ public interface IPJOrderClient {
 	 */
 	@PostMapping(PASS_CANCEL_RW)
 	R passCancelRW(@RequestParam("id") Long id);
+
+
+	/**
+	 * 推送app 消息
+	 *
+	 * @param pushAppMsgVo 推送数据
+	 */
+	@PostMapping(PUSH_APP_MSG)
+	void pushAppMsg(@RequestBody PushAppMsgVo pushAppMsgVo);
 }

+ 20 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/push/vo/PushUserVo.java

@@ -0,0 +1,20 @@
+package org.springblade.salesPart.push.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * @author Rain
+ */
+@Data
+@AllArgsConstructor
+public class PushUserVo {
+
+
+	private Long userId;
+
+
+	private String userName;
+
+
+}

+ 12 - 0
blade-service/blade-pay/src/main/java/org/springblade/pay/tonglianPayment/service/impl/PaymentServiceImpl.java

@@ -10,6 +10,8 @@ import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
 import org.jetbrains.annotations.NotNull;
 import org.springblade.client.entity.*;
 import org.springblade.client.feign.*;
+import org.springblade.common.enums.AppPushPathEnum;
+import org.springblade.common.enums.CommonEnum;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
@@ -25,6 +27,7 @@ import org.springblade.pay.tonglianPayment.service.IWechatMarkService;
 import org.springblade.pay.tonglianPayment.utils.AnalysisMapUtils;
 import org.springblade.pay.tonglianPayment.utils.SybPayService;
 import org.springblade.pay.tonglianPayment.utils.SybUtil;
+import org.springblade.pay.tonglianPayment.vo.PushAppMsgVo;
 import org.springblade.purchase.sales.entity.Order;
 import org.springblade.purchase.sales.entity.OrderItems;
 import org.springblade.purchase.sales.feign.IOrderDescClient;
@@ -62,6 +65,7 @@ import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
 
 /**
  * 标书代理信息表 服务实现类
@@ -944,6 +948,10 @@ public class PaymentServiceImpl implements IPaymentService {
 							DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 							String formatted = now.format(formatter);
 							//给角色为财务的人发送消息
+							PushAppMsgVo pushAppMsgVo = new PushAppMsgVo();
+							pushAppMsgVo.setTitle(AppPushPathEnum.ORDER_NOTIFICATION.title);
+							pushAppMsgVo.setContent(String.format(CommonEnum.ORDER_CONTENT_MSG.info, selectOrder.getOrdNo(), selectOrder.getCustomerName(), selectOrder.getSalerName(), "轮胎数量:" + selectOrder.getGoodsTotalNum() + ",轮胎金额:" + selectOrder.getTotalMoney()));
+							pushAppMsgVo.setOrderId(selectOrder.getId());
 							R<String> clientDeptIds = sysClient.getRoleIds(parametersDetails.getTenantId(), "客服");
 							if (clientDeptIds.isSuccess() && StringUtils.isNotBlank(clientDeptIds.getData())) {
 								String status = sysClient.paramServiceValue( parametersDetails.getTenantId(),"whether.branch.management");
@@ -980,6 +988,8 @@ public class PaymentServiceImpl implements IPaymentService {
 											throw new SecurityException("发送消息失败");
 										}
 									}
+									pushAppMsgVo.setUserIdList(userList.getData().stream().map(User::getId).collect(Collectors.toList()));
+									ipjOrderClient.pushAppMsg(pushAppMsgVo);
 								}
 							}
 							if (ObjectUtils.isNotNull(selectOrder.getSalerId())) {
@@ -1002,6 +1012,8 @@ public class PaymentServiceImpl implements IPaymentService {
 								if (!save.isSuccess()) {
 									throw new SecurityException("发送消息失败");
 								}
+								pushAppMsgVo.setUserIdList(Collections.singletonList(selectOrder.getSalerId()));
+								ipjOrderClient.pushAppMsg(pushAppMsgVo);
 							}
 						}
 						if (useRecoveredBalance.compareTo(BigDecimal.ZERO) > 0) {

+ 18 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/feign/PJOrderClient.java

@@ -5,10 +5,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springblade.common.enums.AppPushPathEnum;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.pay.tonglianPayment.vo.PushAppMsgVo;
 import org.springblade.salesPart.entity.PjOrder;
 import org.springblade.salesPart.entity.PjOrderItems;
 import org.springblade.salesPart.entity.PjProductLaunch;
@@ -16,7 +18,9 @@ import org.springblade.salesPart.feign.IPJOrderClient;
 import org.springblade.salesPart.order.service.IOrderItemsService;
 import org.springblade.salesPart.order.service.IOrderService;
 import org.springblade.salesPart.productLaunch.service.IProductLaunchService;
+import org.springblade.salesPart.push.dto.AppMsgPushDto;
 import org.springblade.salesPart.share.service.ISharePutOnShelvesService;
+import org.springblade.salesPart.util.PushUtil;
 import org.springblade.system.feign.ISysClient;
 import org.springframework.web.bind.annotation.RestController;
 import springfox.documentation.annotations.ApiIgnore;
@@ -42,6 +46,9 @@ public class PJOrderClient implements IPJOrderClient {
 
 	private final ISharePutOnShelvesService sharePutOnShelvesService;
 
+	private final PushUtil pushUtil;
+
+
 	@Override
 	public void updateOrder(List<PjOrder> order) {
 		orderService.updateBatchById(order);
@@ -178,4 +185,15 @@ public class PJOrderClient implements IPJOrderClient {
 	public R passCancelRW(Long id) {
 		return orderService.passCancelRW(id);
 	}
+
+	@Override
+	public void pushAppMsg(PushAppMsgVo pushAppMsgVo) {
+		AppMsgPushDto pushDto = new AppMsgPushDto();
+		pushDto.setTitle(pushAppMsgVo.getTitle());
+		pushDto.setContent(pushAppMsgVo.getContent());
+		pushDto.setPagePath(AppPushPathEnum.ORDER_NOTIFICATION.path);
+		pushDto.setPageQuery("{\"id\":\"" + pushAppMsgVo.getOrderId() + "\"}");
+		String result = pushUtil.sendAppTitleMsgByList(pushAppMsgVo.getUserIdList(), pushDto);
+		log.info("app推送返回:--" + result);
+	}
 }

+ 65 - 59
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/service/impl/ShipServiceImpl.java

@@ -17,7 +17,9 @@ import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
 import okhttp3.*;
 import org.springblade.client.entity.Message;
 import org.springblade.client.feign.IMessageClient;
+import org.springblade.common.enums.AppPushPathEnum;
 import org.springblade.common.enums.NumberEnum;
+import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.jackson.JsonUtil;
@@ -46,6 +48,8 @@ import org.springblade.salesPart.order.mapper.OrderMapper;
 import org.springblade.salesPart.order.service.IOrderItemsService;
 import org.springblade.salesPart.order.service.IOrderRecordService;
 import org.springblade.salesPart.productLaunch.service.IProductLaunchService;
+import org.springblade.salesPart.push.dto.AppMsgPushDto;
+import org.springblade.salesPart.push.vo.PushUserVo;
 import org.springblade.salesPart.serial.service.IPjpfSerialService;
 import org.springblade.salesPart.share.service.ISharePutOnShelvesService;
 import org.springblade.salesPart.ship.mapper.ShipMapper;
@@ -60,6 +64,7 @@ import org.springblade.salesPart.storage.entity.ReservoirArea;
 import org.springblade.salesPart.storage.mapper.StorageDescMapper;
 import org.springblade.salesPart.storage.service.IReservoirAreaService;
 import org.springblade.salesPart.util.ParameterUtils;
+import org.springblade.salesPart.util.PushUtil;
 import org.springblade.salesPart.vo.OrderRecordVO;
 import org.springblade.salesPart.vo.ShipVO;
 import org.springblade.system.entity.Dept;
@@ -130,6 +135,8 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 
 	private final IReservoirAreaService reservoirAreaService;
 
+	private final PushUtil pushUtil;
+
 	/**
 	 * 获取收发货订单详情
 	 *
@@ -6739,9 +6746,10 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public R outboundWorkOrderV1(String ids) {
+		BladeUser nowOutBoundWorkUser = AuthUtil.getUser();
 		List<Long> shipIds = Func.toLongList(ids);
 		List<PjShip> pjShipList = baseMapper.selectList(new LambdaQueryWrapper<PjShip>()
-			.eq(PjShip::getTenantId, AuthUtil.getTenantId())
+			.eq(PjShip::getTenantId, nowOutBoundWorkUser.getTenantId())
 			.eq(PjShip::getIsDeleted, 0)
 			.apply("find_in_set(id,'" + ids + "')"));
 		List<PjOrderItems> pjOrderItemsList = new ArrayList<>();
@@ -6755,13 +6763,13 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 				.in("pid", ordIds)
 				.eq("is_deleted", 0)
 				.apply("goods_num != send_num")
-				.eq("tenant_id", AuthUtil.getTenantId()));
+				.eq("tenant_id", nowOutBoundWorkUser.getTenantId()));
 		}
 		if (!pjOrderItemsList.isEmpty()) {
 			List<Long> goodsId = pjOrderItemsList.stream().map(PjOrderItems::getGoodsId).filter(Objects::nonNull).collect(Collectors.toList());
 			if (!goodsId.isEmpty() && !storageId.isEmpty()) {
 				stockDescList = iStockDescService.list(new LambdaQueryWrapper<PjStockDesc>()
-					.eq(PjStockDesc::getTenantId, AuthUtil.getTenantId())
+					.eq(PjStockDesc::getTenantId, nowOutBoundWorkUser.getTenantId())
 					.eq(PjStockDesc::getIsDeleted, 0)
 					.in(PjStockDesc::getGoodsId, goodsId)
 					.in(PjStockDesc::getStorageId, storageId));
@@ -6787,10 +6795,10 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			gdShip.setId(null);
 			gdShip.setBillno(billNo);
 			gdShip.setStatusName(OrderTypeEnum.TOBESHIPPEDOUT.getType());
-			gdShip.setTenantId(AuthUtil.getTenantId());
+			gdShip.setTenantId(nowOutBoundWorkUser.getTenantId());
 			gdShip.setBizTypeName(OrderTypeEnum.FHGD.getType());
-			gdShip.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
-			gdShip.setCreateUser(AuthUtil.getUserId());
+			gdShip.setCreateDept(Long.valueOf(nowOutBoundWorkUser.getDeptId()));
+			gdShip.setCreateUser(nowOutBoundWorkUser.getUserId());
 			gdShip.setCreateTime(new Date());
 			gdShip.setTaskId(rwShip.getId());
 			gdShip.setSendTotalNum(new BigDecimal("0.00"));
@@ -6828,8 +6836,8 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 								shipItems.setPid(item.getId());
 								shipItems.setSrcItemId(e.getId());
 								shipItems.setCreateTime(new Date());
-								shipItems.setCreateUser(AuthUtil.getUserId());
-								shipItems.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+								shipItems.setCreateUser(nowOutBoundWorkUser.getUserId());
+								shipItems.setCreateDept(Long.valueOf(nowOutBoundWorkUser.getDeptId()));
 								BigDecimal sendNum = e.getGoodsNum().subtract(e.getSendNum());
 								if (balanceQuantity.compareTo(sendNum) >= 0) {
 									shipItems.setSendNum(sendNum);
@@ -6861,61 +6869,59 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			saveHistory(item.getId(), OrderTypeEnum.TOBESHIPPEDOUT.getType());
 
 			//给角色为派工的人发送消息
-			if (ObjectUtils.isNotNull(rwShip.getStockClerkId())) {
-				Message sendMessage = new Message();
-				sendMessage.setParameter(item.getId() + "");
-				sendMessage.setUserName(AuthUtil.getUserName());
-				sendMessage.setUserId(null);
-				sendMessage.setToUserId(rwShip.getStockClerkId());
-				sendMessage.setToUserName(rwShip.getStockClerkName());
-				sendMessage.setMessageType(1);
-				sendMessage.setTenantId(AuthUtil.getTenantId());
-				sendMessage.setCreateUser(null);
-				sendMessage.setCreateTime(new Date());
-				sendMessage.setUrl("/tirePartsMall/salesManagement/outboundWorkOrder/index");
-				sendMessage.setPageLabel("出库工单");
-				sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
-				sendMessage.setMessageBody("您有新的出库工单请及时处理!单号:" + item.getBillno() + "时间:" + formatted);
-				R save = messageClient.save(sendMessage);
+			List<PushUserVo> sendMsgUserIds = new ArrayList<>();
+			send: if (ObjectUtils.isNotNull(rwShip.getStockClerkId())) {
+				sendMsgUserIds.add(new PushUserVo(rwShip.getStockClerkId(), rwShip.getStockClerkName()));
+			} else {
+				R<String> clientRoleIds = sysClient.getRoleIds(nowOutBoundWorkUser.getTenantId(), "库管");
+				if (!clientRoleIds.isSuccess() || StringUtils.isBlank(clientRoleIds.getData())) {
+					break send;
+				}
+				Long sendUserStorageId = null;
+				if (ParameterUtils.whetherDatabaseSharding()) {
+					sendUserStorageId = item.getStorageId();
+				}
+				R<List<User>> userList = userClient.listUserByRoleId(clientRoleIds.getData(), nowOutBoundWorkUser.getTenantId(),
+					item.getSalesCompanyId() + "", sendUserStorageId);
+				if (!userList.isSuccess() || CollectionUtils.isEmpty(userList.getData())) {
+					break send;
+				}
+				sendMsgUserIds = userList.getData().stream().map(usr -> new PushUserVo(usr.getId(), usr.getRealName())).collect(Collectors.toList());
+			}
+			if (CollectionUtils.isNotEmpty(sendMsgUserIds)) {
+				List<Message> sendMessageList = new ArrayList<>();
+				Date sendMsgDate = new Date();
+				String msgBody = "您有新的出库工单请及时处理!单号:" + item.getBillno() + "时间:" + formatted;
+				for (PushUserVo e : sendMsgUserIds) {
+					Message sendMessage = new Message();
+					sendMessageList.add(sendMessage);
+					sendMessage.setParameter(item.getId() + "");
+					sendMessage.setUserName(nowOutBoundWorkUser.getUserName());
+					sendMessage.setUserId(null);
+					sendMessage.setMessageType(1);
+					sendMessage.setTenantId(nowOutBoundWorkUser.getTenantId());
+					sendMessage.setCreateUser(null);
+					sendMessage.setCreateTime(sendMsgDate);
+					sendMessage.setUrl("/tirePartsMall/salesManagement/outboundWorkOrder/index");
+					sendMessage.setPageLabel("出库工单");
+					sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
+					sendMessage.setMessageBody(msgBody);
+					sendMessage.setToUserId(e.getUserId());
+					sendMessage.setToUserName(e.getUserName());
+				}
+				R save = messageClient.saveList(sendMessageList);
 				System.out.println("发送结果:" + save);
+				// 不合理,消息的成功与否不应该影响主流程
 				if (!save.isSuccess()) {
 					throw new SecurityException("发送消息失败");
 				}
-			} else {
-				//给角色为派工的人发送消息
-				R<String> clientDeptIds = sysClient.getRoleIds(AuthUtil.getTenantId(), "库管");
-				if (clientDeptIds.isSuccess() && StringUtils.isNotBlank(clientDeptIds.getData())) {
-					Long storage_id = null;
-					if (ParameterUtils.whetherDatabaseSharding()) {
-						storage_id = item.getStorageId();
-					}
-					R<List<User>> userList = userClient.listUserByRoleId(clientDeptIds.getData(), AuthUtil.getTenantId(),
-						item.getSalesCompanyId() + "", storage_id);
-					if (userList.isSuccess() && CollectionUtils.isNotEmpty(userList.getData())) {
-						for (User datum : userList.getData()) {
-							//循环发送消息
-							Message sendMessage = new Message();
-							sendMessage.setParameter(item.getId() + "");
-							sendMessage.setUserName(AuthUtil.getUserName());
-							sendMessage.setUserId(null);
-							sendMessage.setToUserId(datum.getId());
-							sendMessage.setToUserName(datum.getName());
-							sendMessage.setMessageType(1);
-							sendMessage.setTenantId(AuthUtil.getTenantId());
-							sendMessage.setCreateUser(null);
-							sendMessage.setCreateTime(new Date());
-							sendMessage.setUrl("/tirePartsMall/salesManagement/outboundWorkOrder/index");
-							sendMessage.setPageLabel("出库工单");
-							sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
-							sendMessage.setMessageBody("您有新的出库工单请及时处理!单号:" + item.getBillno() + "时间:" + formatted);
-							R save = messageClient.save(sendMessage);
-							System.out.println("发送结果:" + save);
-							if (!save.isSuccess()) {
-								throw new SecurityException("发送消息失败");
-							}
-						}
-					}
-				}
+				List<Long> userIds = sendMsgUserIds.stream().map(PushUserVo::getUserId).collect(Collectors.toList());
+				AppMsgPushDto pushDto = new AppMsgPushDto();
+				pushDto.setTitle(AppPushPathEnum.WAREHOUSE_DELIVERY_NOTIFICATION.title);
+				pushDto.setContent(msgBody);
+				pushDto.setPagePath(AppPushPathEnum.WAREHOUSE_DELIVERY_NOTIFICATION.path);
+				pushDto.setPageQuery("{\"id\":\"" + item.getId() + "\"}");
+				pushUtil.sendAppTitleMsgByList(userIds, pushDto);
 			}
 			//给角色为财务的人发送消息
 			StringBuilder openIds = new StringBuilder();

+ 6 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/util/PushUtil.java

@@ -12,6 +12,7 @@ import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
+import org.springblade.common.enums.NumberEnum;
 import org.springblade.core.tool.utils.CollectionUtil;
 import org.springblade.salesPart.enums.FinalMap;
 import org.springblade.salesPart.push.dto.AppMsgPushDto;
@@ -78,6 +79,11 @@ public class PushUtil {
 		if (CollectionUtil.isEmpty(userIds) || Objects.isNull(pushDto)) {
 			return null;
 		}
+		// 必须为true,否则无法推送
+		pushDto.setDev(true);
+		if (pushDto.getContent().length() > NumberEnum.FIFTY.number) {
+			pushDto.setContent(pushDto.getContent().substring(0, 50));
+		}
 		List<UserPushCid> userPushCidList = userPushCidMapper.selectList(new LambdaQueryWrapper<UserPushCid>().in(UserPushCid::getUserId, userIds).eq(UserPushCid::getStatus, 1));
 		if (CollectionUtil.isEmpty(userPushCidList)) {
 			return null;