Переглянути джерело

统计分析 费用明细 账单明细 销售订单修改

ioioio 3 роки тому
батько
коміт
4e5356f2e0

+ 4 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/entity/FeesType.java

@@ -19,9 +19,11 @@ package org.springblade.client.entity;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -93,6 +95,8 @@ public class FeesType implements Serializable {
 	 * 创建时间
 	 */
 	@ApiModelProperty(value = "创建时间")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
 	private Date createTime;
 	/**
 	 * 创建时间

+ 3 - 0
blade-service-api/blade-project-api/src/main/java/org/springblade/project/entity/ServiceProjectItem.java

@@ -136,5 +136,8 @@ public class ServiceProjectItem extends TenantEntity implements Serializable {
     @TableField(exist = false)
 	private BigDecimal grossIncome;
 
+	@TableField(exist = false)
+	private Long cornId;
+
 
 }

+ 22 - 0
blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/vo/OrderStatisticAnalysisVO.java

@@ -40,5 +40,27 @@ public class OrderStatisticAnalysisVO
    private Long createUser;
    //时间
    private Date createTime;
+   //发票抬头
+   private String vbrk;
+   //利润
+   private BigDecimal profit;
+   	//物流费用
+   	private BigDecimal deliverMoney;
+	//开票金额
+	private BigDecimal InvoiceAmount;
+	//成本金额
+	private BigDecimal costAmount;
+	//成本单价
+	private BigDecimal unitPrice;
+	//关税
+	private BigDecimal customDutyMoney;
+	//配额
+	private BigDecimal quotaMoney;
+	//增值税
+	private BigDecimal gstMoney;
+	//货款
+	private BigDecimal itemMoney;
+
+
 
 }

+ 6 - 0
blade-service-api/trade-finance-api/src/main/java/org/springblade/finance/feign/IFinanceClient.java

@@ -2,13 +2,16 @@ package org.springblade.finance.feign;
 
 import io.swagger.annotations.ApiParam;
 import org.springblade.core.tool.api.R;
+import org.springblade.finance.entity.Acc;
 import org.springblade.finance.entity.Settlement;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
 
+import javax.validation.Valid;
 import java.util.List;
 
 @FeignClient(
@@ -30,4 +33,7 @@ public interface IFinanceClient
 
 	@GetMapping("/settlement/detail")
 	R<Settlement> detail(Settlement settlement);
+
+	@PostMapping("/acc/getAccListByCondition")
+	R<List<Acc>> getAccListByCondition( @RequestBody Acc acc);
 }

+ 4 - 2
blade-service/blade-client/src/main/java/org/springblade/client/message/handler/WebSocketHandler.java

@@ -47,13 +47,15 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
 	 * webSocket连接创建后调用
 	 */
 	@Override
-	public void afterConnectionEstablished(WebSocketSession session) {
+	public void afterConnectionEstablished(WebSocketSession session)
+	{
 		// 获取参数
 		String userId = String.valueOf(session.getAttributes().get("user"));
 		String sessionId = getSessionId(session);
 		userMap.put(userId, getSessionId(session));
 		sessionMap.put(sessionId, session);
-		log.info("【当前socket链接人数】:==>"+sessionMap.size());
+		log.info("【当前socket在线人数】:==>"+userMap.size());
+		log.info("【当前socket连接数】:==>"+sessionMap.size());
 		send(userId);
 	}
 

+ 1 - 1
blade-service/blade-project/src/main/java/org/springblade/project/controller/ProjectController.java

@@ -280,7 +280,7 @@ public class ProjectController {
 				  e.setStrStatus(str[e.getStatus()]);
 				  Long corpId = serviceProjectService.getOne(new LambdaQueryWrapper<ServiceProject>()
 					  .eq(ServiceProject::getId,e.getPId())).getCorpId();
-
+				  e.setCornId(corpId);
 				  R<CorpsDesc> corpMessage = corpsDescClient.getCorpMessage(corpId);
 				  if(corpMessage.isSuccess())
 				  {

+ 6 - 0
blade-service/blade-purchase-sales/pom.xml

@@ -71,6 +71,12 @@
             <version>2.8.2.RELEASE</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>trade-finance-api</artifactId>
+            <version>2.8.2.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
 </project>

+ 180 - 1
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/controller/OrderController.java

@@ -30,13 +30,17 @@ import lombok.AllArgsConstructor;
 import javax.validation.Valid;
 
 import org.springblade.client.entity.CorpsDesc;
+import org.springblade.client.entity.FeesDesc;
 import org.springblade.client.feign.ICorpsDescClient;
+import org.springblade.client.feign.IFeesDescClient;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.finance.entity.Acc;
+import org.springblade.finance.feign.IFinanceClient;
 import org.springblade.purchase.sales.entity.OrderFees;
 import org.springblade.purchase.sales.entity.OrderItems;
 import org.springblade.purchase.sales.service.*;
@@ -74,6 +78,8 @@ public class OrderController extends BladeController {
 	private final IOrderPartsService orderPartsService;
 	private final ICorpsDescClient corpsDescClient;//获取客户信息
 	private final IUserClient userClient;//获取用户信息
+	private final IFeesDescClient feesDescClient;
+	private final IFinanceClient iFinanceClient;
 
 	/**
 	 * 详情
@@ -349,11 +355,184 @@ public class OrderController extends BladeController {
 						e.setSaleCorpName(corpsDescClientCorpMessage.getData().getCname());
 					}
 				}
-
+				//采购主表id
 				Long orderId = e.getOrderId();
+				LambdaQueryWrapper<Order> orderLambdaQueryWrapper=new LambdaQueryWrapper<>();
+				orderLambdaQueryWrapper
+					.eq(Order::getId,orderId)
+					.eq(Order::getTenantId,AuthUtil.getTenantId())
+					.eq(Order::getIsDeleted,0);
+
+				Order service = orderService.getOne(orderLambdaQueryWrapper);
+
 
+				//调用-费用微服务-获取费用设置详情
+				R<FeesDesc> customDuty = feesDescClient.getFeesByName("关税");
+				Long customDutyId=null;
+                if(customDuty.isSuccess())
+                {
+					customDutyId=customDuty.getData().getId();
+				}
 
+				Long quotaId=null;
+				R<FeesDesc> quota = feesDescClient.getFeesByName("配额");
+				if(quota.isSuccess())
+				{
+					quotaId=quota.getData().getId();
+				}
 
+				Long gstId=null;
+				R<FeesDesc> GST = feesDescClient.getFeesByName("增值税");
+				if(GST.isSuccess())
+				{
+					gstId=GST.getData().getId();
+				}
+
+                Long deliverId=null;
+				R<FeesDesc> deliver = feesDescClient.getFeesByName("物流费");
+				if(deliver.isSuccess())
+				{
+					deliverId=deliver.getData().getId();
+				}
+
+				//获取关税账单明细
+				Acc customDutyAcc=new Acc();
+				customDutyAcc.setSrcType(2);
+				customDutyAcc.setSrcFeesId(customDutyId);
+				customDutyAcc.setSrcParentId(orderId);
+				R<List<Acc>> accListByCondition = iFinanceClient.getAccListByCondition(customDutyAcc);
+				//关税
+				BigDecimal customDutyMoney=BigDecimal.ZERO;
+				if(accListByCondition.isSuccess())
+				{
+					List<Acc> customDutyList = accListByCondition.getData();
+						//关税
+
+						if(CollectionUtils.isNotEmpty(customDutyList))
+						{
+							customDutyMoney=customDutyList.stream().reduce(BigDecimal.ZERO,(x,y) ->{ return x.add(y.getAmount().multiply(y.getExchangeRate())); },BigDecimal::add);
+						}
+						else
+						{
+							customDutyMoney=BigDecimal.ZERO;
+						}
+
+				}
+                e.setCustomDutyMoney(customDutyMoney);
+
+				//获取配额账单明细
+				Acc quotaAcc=new Acc();
+				quotaAcc.setSrcType(2);
+				quotaAcc.setSrcFeesId(quotaId);
+				quotaAcc.setSrcParentId(orderId);
+				R<List<Acc>> accListByCondition2 = iFinanceClient.getAccListByCondition(quotaAcc);
+				//配额
+				BigDecimal quotaMoney=BigDecimal.ZERO;
+				if(accListByCondition2.isSuccess())
+				{
+					List<Acc> quotaList = accListByCondition2.getData();
+						//配额
+						if(CollectionUtils.isNotEmpty(quotaList))
+						{
+							quotaMoney=quotaList.stream().reduce(BigDecimal.ZERO,(x,y) ->{ return x.add(y.getAmount().multiply(y.getExchangeRate())); },BigDecimal::add);
+						}
+						else
+						{
+							quotaMoney=BigDecimal.ZERO;
+						}
+
+				}
+                e.setQuotaMoney(quotaMoney);
+				//获取增值税账单明细
+				Acc gstAcc=new Acc();
+				gstAcc.setSrcType(2);
+				gstAcc.setSrcFeesId(gstId);
+				gstAcc.setSrcParentId(orderId);
+				R<List<Acc>> accListByCondition3 = iFinanceClient.getAccListByCondition(gstAcc);
+				//增值税
+				BigDecimal gstMoney=BigDecimal.ZERO;
+				if(accListByCondition3.isSuccess())
+				{
+					List<Acc> gstList = accListByCondition3.getData();
+
+						//增值税
+						if(CollectionUtils.isNotEmpty(gstList))
+						{
+							gstMoney=gstList.stream().reduce(BigDecimal.ZERO,(x,y) ->{ return x.add(y.getAmount().multiply(y.getExchangeRate())); },BigDecimal::add);
+						}
+						else
+						{
+							gstMoney=BigDecimal.ZERO;
+						}
+
+				}
+                e.setGstMoney(gstMoney);
+				//获取货款账单明细
+				Acc itemAcc=new Acc();
+				itemAcc.setSrcType(1);
+				itemAcc.setSrcFeesId(null);
+				itemAcc.setSrcParentId(orderId);
+				R<List<Acc>> accListByCondition4 = iFinanceClient.getAccListByCondition(itemAcc);
+				//货款
+				BigDecimal itemMoney=BigDecimal.ZERO;
+				if(accListByCondition4.isSuccess())
+				{
+					List<Acc> itemList = accListByCondition4.getData();
+					if(CollectionUtils.isNotEmpty(itemList))
+					{
+						//货款
+						itemMoney=itemList.stream().reduce(BigDecimal.ZERO,(x,y) ->{ return x.add(y.getAmount().multiply(y.getExchangeRate())); },BigDecimal::add);
+					}
+					else
+					{
+						itemMoney=BigDecimal.ZERO;
+					}
+				}
+				e.setItemMoney(itemMoney);
+				//销售主表信息
+				LambdaQueryWrapper<Order> saleOrderWrapper=new LambdaQueryWrapper<>();
+				saleOrderWrapper.eq(Order::getId,e.getOrderSaleId()).eq(Order::getTenantId,AuthUtil.getTenantId());
+				Order serviceOne = orderService.getOne(saleOrderWrapper);
+
+				//成本单价=(货款+关税+配额)/发票重量---精确小数点2位
+                BigDecimal unitPrice=((itemMoney.add(quotaMoney)).add(customDutyMoney)).divide(service.getInvoiceWeight(),2,BigDecimal.ROUND_DOWN);
+                e.setUnitPrice(unitPrice);
+				if(serviceOne.getExchangeRate()==null)
+				{
+                   throw new SecurityException("销售订单:"+serviceOne.getOrderNo()+",汇率未填,无法完成统计");
+				}
+				//开票金额= 销售订单明细总价*销售订单主表的汇率
+				BigDecimal InvoiceAmount=e.getAmount().multiply(serviceOne.getExchangeRate());
+				e.setInvoiceAmount(InvoiceAmount);
+				//成本金额=提货数量*成本价格
+				BigDecimal costAmount=e.getSaleBillWeight().multiply(unitPrice);
+				e.setCostAmount(costAmount);
+				//物流费用
+				Acc deliverAcc=new Acc();
+				deliverAcc.setSrcType(2);
+				deliverAcc.setSrcFeesId(deliverId);
+				deliverAcc.setSrcParentId(e.getOrderSaleId());
+				R<List<Acc>> accListByCondition5 = iFinanceClient.getAccListByCondition(gstAcc);
+				BigDecimal deliverMoney=BigDecimal.ZERO;
+				if(accListByCondition5.isSuccess())
+				{
+					List<Acc> deliverMoneyList = accListByCondition5.getData();
+					//关税
+
+					if(CollectionUtils.isNotEmpty(deliverMoneyList))
+					{
+						deliverMoney=deliverMoneyList.stream().reduce(BigDecimal.ZERO,(x,y) ->{ return x.add(y.getAmount().multiply(y.getExchangeRate())); },BigDecimal::add);
+					}
+					else
+					{
+						deliverMoney=BigDecimal.ZERO;
+					}
+
+				}
+				e.setDeliverMoney(deliverMoney);
+                //利润=开票金额-成本金额-物流费用
+				BigDecimal profit=(InvoiceAmount.subtract(costAmount)).subtract(deliverMoney);
+                e.setProfit(profit);
 			});
 		}
 		orderStatisticAnalysisVOIPage.setRecords(records);

+ 2 - 1
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/OrderMapper.xml

@@ -414,7 +414,8 @@
         b.amount as amount,
         b.create_user as createUser,
         b.create_time as createTime,
-        b.org_order_no as orgOrderNo
+        b.org_order_no as orgOrderNo,
+        b.vbrk as vbrk
         FROM
         business_order a,
         business_order_items b

+ 17 - 0
blade-service/trade-finance/src/main/java/org/springblade/finance/controller/AccController.java

@@ -19,6 +19,8 @@ package org.springblade.finance.controller;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import org.springblade.client.entity.Message;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.finance.vo.AccVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -172,5 +174,20 @@ public class AccController extends BladeController {
 		return R.status(accService.removeByIds(Func.toLongList(ids)));
 	}
 
+	@PostMapping("/getAccListByCondition")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "获取", notes = "传入ids")
+	public R<List<Acc>> getAccListByCondition(@Valid @RequestBody Acc acc)
+	{
+        LambdaQueryWrapper<Acc> accLambdaQueryWrapper=new LambdaQueryWrapper<>();
+		accLambdaQueryWrapper
+			.eq(Acc::getTenantId, AuthUtil.getTenantId())
+			.eq(Acc::getSrcType,acc.getSrcType())
+			.eq(acc.getSrcParentId()!=null,Acc::getSrcParentId,acc.getSrcParentId())
+			.eq(acc.getSrcFeesId()!=null,Acc::getSrcFeesId,acc.getSrcFeesId());
+		List<Acc> list = accService.list(accLambdaQueryWrapper);
+		return R.data(list);
+
+	}
 
 }