Commit 8c77756e authored by 李驰骋's avatar 李驰骋

看板数据接品提交

parent 4dd88739
package com.topsunit.scanservice.ximai.controller.kanban;
import com.topsunit.scanservice.ximai.dto.kanban.MaterialStatDataDto;
import com.topsunit.scanservice.ximai.service.kanban.MaterialStatService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MaterialStatController {
@Autowired
MaterialStatService materialStatService;
@ApiOperation("查询供应商列表")
@PostMapping("/materialStat/allData")
public MaterialStatDataDto allData(){
MaterialStatDataDto rst = materialStatService.allData();
return rst;
}
}
package com.topsunit.scanservice.ximai.dao;
import com.topsunit.scanservice.ximai.dto.kanban.*;
import com.topsunit.scanservice.ximai.entity.Mocta;
import com.topsunit.scanservice.ximai.entity.MoctaId;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
import java.util.Optional;
/**
......@@ -14,4 +18,56 @@ import java.util.Optional;
*/
public interface MoctaDao extends JpaRepository<Mocta, MoctaId>, JpaSpecificationExecutor<Mocta> {
Optional<Mocta> findFirstByTa001AndTa002(String ta001, String ta002);
/**
* 物料配送完成率
* @return
*/
@Query(value = "select sum(b.TB004) denominator,sum(b.TB005) numerator from MOCTA a left join MOCTB b on a.TA001 = b.TB001 and a.TA002 = b.TB002 " +
"where a.TA009 > :start and a.TA009 < :end", nativeQuery = true)
Optional<StockInCompleteRatio> statStockInCompleteRatio(@Param(value = "start") String start, @Param(value = "end")String end);
/**
* 采购到货完成率
* @return
*/
@Query(value = "select sum(TD008) denominator,sum(TD015) numerator from PURTD \n" +
"where TD012 > :start and TD012 < :end", nativeQuery = true)
Optional<MaterialDistRatio> statMaterialDistRatio(@Param(value = "start") String start, @Param(value = "end")String end);
/**
* 销售发货及时率
* @return
*/
@Query(value = "select t1.TO001 applyType,t1.TO002 applyNo,t1.UDF01 planOutDate,t1.TO017 outQuantity,t1.TO024 planOutQuantity,t2.TG003 outDate from COPTO t1 \n" +
"\tleft join (select max(TG003) TG003,TH045,TH046,TH047 from COPTG o1 left join COPTH o2 on o1.TG001 = o2.TH001\n" +
"and o1.TG002 = o2.TH002 group by TH045,TH046,TH047) t2 on t1.TO001 = t2.TH045 and t1.TO002 = t2.TH046 and t1.TO003 = t2.TH047" +
"\twhere t1.UDF01 > :start and t1.UDF01 < :end", nativeQuery = true)
List<SalesTimelyDeliveryRatio> statSalesTimelyDeliveryRatio(@Param(value = "start") String start, @Param(value = "end")String end);
/**
* 入库存趋势图
* @return
*/
@Query(value = "select f.TF003 startDate,sum(g.TG011) quantity from MOCTF f left join MOCTG g on f.TF001 = g.TG001 and f.TF002 = g.TG002\n" +
"where f.TF003 > :start and f.TF003 < :end group by f.TF003", nativeQuery = true)
List<StockInTrend> statStockInTrend(@Param(value = "start") String start, @Param(value = "end")String end);
/**
* 出库存趋势图
* @return
*/
@Query(value = "select g.TG003 startDate,sum(h.TH008) quantity from COPTG g left join COPTH h on g.TG001 = h.TH001 and g.TG002 = h.TH002\n" +
"where g.TG003 > :start and g.TG003 < :end and g.TG023 ='Y' group by g.TG003", nativeQuery = true)
List<StockOutTrend> statStockOutTrend(@Param(value = "start") String start, @Param(value = "end")String end);
/**
* 当月销售出库计划
* @return
*/
@Query(value = "select t1.TO007 itemCode,t1.TO001 applyType,t1.TO002 applyNo,t1.UDF01 planOutDate,t1.TO024 planOutNum,t1.TO017 outNum from COPTO t1 \n" +
"where t1.UDF01 > :start and t1.UDF01 < :end", nativeQuery = true)
List<SalesOutboundPlan> salesOutboundPlanList(@Param(value = "start") String start, @Param(value = "end")String end);
}
package com.topsunit.scanservice.ximai.dto.kanban;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.math.BigDecimal;
@Data
@AllArgsConstructor
public class BasicDailyData {
@ApiModelProperty("日")
int day;
@ApiModelProperty("值")
BigDecimal value = BigDecimal.ZERO;
}
package com.topsunit.scanservice.ximai.dto.kanban;
import java.math.BigDecimal;
public interface MaterialDistRatio {
/**
* 需领用量
* @return
*/
public BigDecimal getDenominator();
/**
* 已领用量
* @return
*/
public BigDecimal getNumerator();
}
package com.topsunit.scanservice.ximai.dto.kanban;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Data
public class MaterialStatDataDto {
@ApiModelProperty("物料配送完成率")
BigDecimal stockInCompleteRatio = BigDecimal.ZERO;
@ApiModelProperty("采购到货完成率")
BigDecimal materialDistRatio = BigDecimal.ZERO;
@ApiModelProperty("销售发货及时率")
BigDecimal salesTimelyDeliveryRatio = BigDecimal.ZERO;
@ApiModelProperty("库存趋势图")
InventoryTrend inventoryTrend;
@ApiModelProperty("销售出库计划")
List<SalesOutboundPlan> salesOutboundPlanList;
@Data
public static class InventoryTrend{
@ApiModelProperty("生产入库趋势")
List<BasicDailyData> stockInTrend=new ArrayList<>();
@ApiModelProperty("发货出库趋势图")
List<BasicDailyData> stockOutTrend=new ArrayList<>();
}
@Data
public static class SalesOutboundPlan{
@ApiModelProperty("通知单号")
String outApplyNo;
@ApiModelProperty("产品号")
String itemNo;
@ApiModelProperty("计划出库时间")
String planOutDate;
@ApiModelProperty("计划数量")
BigDecimal planQuantity;
@ApiModelProperty("已出库数量")
BigDecimal outQuantity;
}
}
package com.topsunit.scanservice.ximai.dto.kanban;
import java.math.BigDecimal;
public interface SalesOutboundPlan {
/**
* 物料编号
* @return
*/
public String getItemCode();
/**
* 通知单号
* @return
*/
public String getApplyNo();
/**
* 通知单类型
* @return
*/
public String getApplyType();
/**
* 计划出库日期
* @return
*/
public String getPlanOutDate();
/**
* 计划出库数量
* @return
*/
public BigDecimal getPlanOutNum();
/**
* 出库数量
* @return
*/
public BigDecimal getOutNum();
}
package com.topsunit.scanservice.ximai.dto.kanban;
import java.math.BigDecimal;
public interface SalesTimelyDeliveryRatio {
/**
* 通知单别
* @return
*/
public String getApplyType();
/**
* 通知单号
* @return
*/
public String getApplyNo();
/**
* 计划出库日期
* @return
*/
public String getPlanOutDate();
/**
* 预计出货数
* @return
*/
public BigDecimal getPlanOutQuantity();
/**
* 实际出货数
* @return
*/
public BigDecimal getOutQuantity();
/**
* 销货日期
* @return
*/
public String getOutDate();
}
package com.topsunit.scanservice.ximai.dto.kanban;
import java.math.BigDecimal;
public interface StockInCompleteRatio {
/**
* 需领用量
* @return
*/
public BigDecimal getDenominator();
/**
* 已领用量
* @return
*/
public BigDecimal getNumerator();
}
package com.topsunit.scanservice.ximai.dto.kanban;
import java.math.BigDecimal;
public interface StockInTrend {
/**
* 入库日期
* @return
*/
public String getStartDate();
/**
* 入库数量
* @return
*/
public BigDecimal getQuantity();
}
package com.topsunit.scanservice.ximai.dto.kanban;
import java.math.BigDecimal;
public interface StockOutTrend {
/**
* 入库日期
* @return
*/
public String getStartDate();
/**
* 入库数量
* @return
*/
public BigDecimal getQuantity();
}
package com.topsunit.scanservice.ximai.service.kanban;
import cn.hutool.core.date.DateUtil;
import com.topsunit.scanservice.ximai.dao.MoctaDao;
import com.topsunit.scanservice.ximai.dto.kanban.*;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@Service
public class MaterialStatService {
@Autowired
MoctaDao moctaDao;
public MaterialStatDataDto allData(){
LocalDateTime currMonth = LocalDateTime.now().withDayOfMonth(1).with(LocalTime.MIN);
LocalDateTime nextMonth = currMonth.plusMonths(1);
String startDate = DateUtil.format(currMonth, "yyyyMMdd");
String endDate = DateUtil.format(nextMonth, "yyyyMMdd");;
MaterialStatDataDto rst = new MaterialStatDataDto();
Optional<MaterialDistRatio> materialDistRatio = moctaDao.statMaterialDistRatio(startDate, endDate);
materialDistRatio.ifPresent(s->{
if(s.getDenominator().compareTo(BigDecimal.ZERO)>0) {
rst.setMaterialDistRatio(s.getNumerator().divide(s.getDenominator(), 3, BigDecimal.ROUND_DOWN).multiply(new BigDecimal("100")));
}
});
List<SalesTimelyDeliveryRatio> tempList = moctaDao.statSalesTimelyDeliveryRatio(startDate, endDate);
int unTimeCt = 0;//销售发货准时率
String dateStr = DateUtil.format(LocalDateTime.now(), "yyyyMMdd");
for(SalesTimelyDeliveryRatio temp : tempList){
String tempDate = temp.getOutDate();
if(StringUtils.isBlank(tempDate)){
tempDate = dateStr;
}
Integer date = Integer.valueOf(tempDate);
Integer currDate = Integer.valueOf(dateStr);
Integer planDate = Integer.valueOf(temp.getPlanOutDate());
if(date>planDate){
unTimeCt++;
}else if(currDate>planDate && temp.getOutQuantity().compareTo(temp.getPlanOutQuantity())<0){
unTimeCt++;
}
}
if(tempList.size()!=0){
rst.setSalesTimelyDeliveryRatio(new BigDecimal(unTimeCt)
.divide(new BigDecimal(tempList.size()), 3, BigDecimal.ROUND_DOWN).multiply(new BigDecimal("100")));
}
Optional<StockInCompleteRatio> stockInCompleteRatio = moctaDao.statStockInCompleteRatio(startDate, endDate);
stockInCompleteRatio.ifPresent(s->{
if(s.getDenominator().compareTo(BigDecimal.ZERO)>0) {
rst.setStockInCompleteRatio(s.getNumerator().divide(s.getDenominator(), 3, BigDecimal.ROUND_DOWN).multiply(new BigDecimal("100")));
}
});
rst.setSalesOutboundPlanList(this.getSalesOutboundPlan(startDate, endDate));
rst.setInventoryTrend(this.getInventoryTrend(startDate, endDate));
return rst;
}
private List<MaterialStatDataDto.SalesOutboundPlan> getSalesOutboundPlan(String startDate, String endDate){
List<MaterialStatDataDto.SalesOutboundPlan> rst = new ArrayList<>();
List<SalesOutboundPlan> list = moctaDao.salesOutboundPlanList(startDate, endDate);
for (SalesOutboundPlan salesOutboundPlan : list) {
MaterialStatDataDto.SalesOutboundPlan temp = new MaterialStatDataDto.SalesOutboundPlan();
temp.setItemNo(salesOutboundPlan.getItemCode());
temp.setOutApplyNo(salesOutboundPlan.getApplyNo());
temp.setPlanQuantity(salesOutboundPlan.getPlanOutNum());
temp.setOutQuantity(salesOutboundPlan.getOutNum());
temp.setPlanOutDate(salesOutboundPlan.getPlanOutDate());
rst.add(temp);
}
return rst;
}
private MaterialStatDataDto.InventoryTrend getInventoryTrend(String startDate, String endDate){
MaterialStatDataDto.InventoryTrend rst = new MaterialStatDataDto.InventoryTrend();
List<StockInTrend> stockInTrends = moctaDao.statStockInTrend(startDate, endDate);
List<StockOutTrend> stockOutTrends = moctaDao.statStockOutTrend(startDate, endDate);
List<BasicDailyData> stockInTrendList=new ArrayList<>();
List<BasicDailyData> stockOutTrendList=new ArrayList<>();
LocalDateTime start = LocalDateTime.now().withDayOfMonth(1).with(LocalTime.MIN);
LocalDateTime end = start.plusMonths(1).plusDays(-1).with(LocalTime.MAX);
int dayOfMonth = end.getDayOfMonth();
for(int i=1;i<=dayOfMonth;i++){
int j = i;
String dateStr = DateUtil.format(start, "yyyyMMdd");
Optional<StockInTrend> stockInOptional = stockInTrends.stream().filter(s->s.getStartDate().equals(dateStr)).findFirst();
if(!stockInOptional.isPresent()){
stockInTrendList.add(new BasicDailyData(j, BigDecimal.ZERO));
}
stockInOptional.ifPresent(s2->{
stockInTrendList.add(new BasicDailyData(j, s2.getQuantity()));
});
Optional<StockOutTrend> stockOutOptional = stockOutTrends.stream().filter(s->s.getStartDate().equals(dateStr)).findFirst();
if(!stockOutOptional.isPresent()){
stockOutTrendList.add(new BasicDailyData(j, BigDecimal.ZERO));
}
stockOutOptional.ifPresent(s2->{
stockOutTrendList.add(new BasicDailyData(j, s2.getQuantity()));
});
start = start.plusDays(1);
}
rst.setStockInTrend(stockInTrendList);
rst.setStockOutTrend(stockOutTrendList);
return rst;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment