1.增加月度计划原样导入记录

master
董哲奇 5 months ago
parent be5223c9c0
commit 99b9a01afb

@ -373,4 +373,8 @@ public class DmSygdMx implements Serializable {
}catch (Exception ignored){}
this.ylbhgg=bom.getYlbhgg();
}
public boolean isAvailable(){
return !StrUtil.isAllBlank(this.slrq,this.xcpw,this.pw,this.qgrq,this.qgjs,this.mbjb,this.xcmb,this.fdxq,this.gdjs);
}
}

@ -40,7 +40,7 @@ public class DmYdjh implements Serializable {
private String dcPl;
@TableField(exist = false)
private String xzglxq;
private String xzglxq;//来自前方需求
@ApiModelProperty(value = "领取类型")
@TableField("LQLB")
private String lqlb;

@ -0,0 +1,100 @@
package com.dsic.gj_erp.bean.jhgk;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@TableName("ydjh_import")
public class YdjhImport {
@TableId(type = IdType.AUTO)
private String id;
private String dcCh;
private String dcPl;
private String dcFd;
private String bs1;
private String sl;
private String xcpw;
private String pw;
private String yklm;
private String yksk;
private String dbqgks;
private String ykpkjs;
private String eklmbs;
private String lmqgks;
private String lmqgjs;
private String eksk;
private String ekskks;
private String ekpkjs;
private String sksk;
private String skskqgks;
private String skpkjs;
private String skpt;
private String ptks;
private String ptjs;
@TableField("qpt_zjs")
private String qpt_zjs;
private String qptjs;
private String qwbjs;
private String zl;
private String fbbs;
private String fbqgks;
private String fbqgjs;
private String skbs;
private String skqgks;
private String pkqgjs;
private String mbjb;
private String qkxcms;
private String xcmb;
private String fdxq;
private String gdjs;
private String bz;
private int importIndex;
}

@ -1,6 +1,7 @@
package com.dsic.gj_erp.bean.jhgk.excel;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import io.swagger.annotations.ApiModelProperty;
@ -64,36 +65,30 @@ public class JhxfExcel {
@DateTimeFormat("yyyy/MM/dd")
private String ykpkjs;
@ExcelProperty("二垮龙门板数")
// @ExcelProperty("二垮龙门板数")
private String eklmbs;
@ExcelProperty("龙门切割开始")
// @ExcelProperty("龙门切割开始")
@DateTimeFormat("yyyy/MM/dd")
private String lmqgks;
@ExcelProperty("龙门切割结束")
// @ExcelProperty("龙门切割结束")
@DateTimeFormat("yyyy/MM/dd")
private String lmqgjs;
@ApiModelProperty(value = "二垮数控板数")
@ExcelProperty("二垮数控板数")
private String eksk;
@ApiModelProperty(value = "数控切割开始")
@ExcelProperty(value ="数控切割开始",index=16)
// @ExcelProperty(value ="数控切割开始",index=16)
@ExcelProperty(value ="数控切割开始",index=12)
@DateTimeFormat("yyyy/MM/dd")
private String ekskks;
@ApiModelProperty(value = "坡口切割结束")
@ExcelProperty(value ="坡口切割结束",index=17)
// @ExcelProperty(value ="坡口切割结束",index=17)
@ExcelProperty(value ="坡口切割结束",index=13)
@DateTimeFormat("yyyy/MM/dd")
private String ekpkjs;
@ -102,12 +97,14 @@ public class JhxfExcel {
private String sksk;
@ApiModelProperty(value = "数控切割开始")
@ExcelProperty(value ="数控切割开始",index=19)
// @ExcelProperty(value ="数控切割开始",index=19)
@ExcelProperty(value ="数控切割开始",index=15)
@DateTimeFormat("yyyy/MM/dd")
private String skskqgks;
@ApiModelProperty(value = "坡口切割结束")
@ExcelProperty(value ="坡口切割结束",index=20)
// @ExcelProperty(value ="坡口切割结束",index=20)
@ExcelProperty(value ="坡口切割结束",index=16)
@DateTimeFormat("yyyy/MM/dd")
private String skpkjs;
@ -162,22 +159,18 @@ public class JhxfExcel {
@ApiModelProperty(value = "数控 板数")
@ExcelProperty("数控 板数")
private String skbs;
@ApiModelProperty(value = "数控切割开始")
@ExcelProperty(value = "数控切割开始",index = 32)
// @ExcelProperty(value = "数控切割开始",index = 32)
@ExcelProperty(value = "数控切割开始",index = 25)
@DateTimeFormat("yyyy/MM/dd")
private String skqgks;
@ApiModelProperty(value = "坡口切割结束")
@ExcelProperty(value = "坡口切割结束",index = 33)
// @ExcelProperty(value = "坡口切割结束",index = 33)
@ExcelProperty(value = "坡口切割结束",index = 26)
@DateTimeFormat("yyyy/MM/dd")
private String pkqgjs;
@ -189,26 +182,31 @@ public class JhxfExcel {
@ApiModelProperty(value = "七垮型 材米数")
@ExcelProperty("七垮型 材米数")
private String qkxcms;
@ApiModelProperty(value = "型材 面板")
@ExcelProperty("型材 面板")
@DateTimeFormat("yyyy/MM/dd")
private String xcmb;
@ApiModelProperty(value = "分段需求/小组配送结束")
@ExcelProperty("小组配送结束")
@DateTimeFormat("yyyy/MM/dd")
private String fdxq;
@ApiModelProperty(value = "光电 结束")
@ExcelProperty("光电 结束")
@DateTimeFormat("yyyy/MM/dd")
private String gdjs;
@ApiModelProperty(value = "备注")
@ExcelProperty("备注")
private String bz;
@ExcelIgnore
private Boolean qwbBs=false;
public boolean isAvailable(){
return !StrUtil.isAllBlank(this.sl,this.xcpw,this.pw,this.dbqgks,this.ykpkjs,this.lmqgks,this.lmqgjs,
return !StrUtil.isAllEmpty(this.sl,this.xcpw,this.pw,this.dbqgks,this.ykpkjs,this.lmqgks,this.lmqgjs,
this.ekskks,this.ekpkjs,this.skskqgks,this.skpkjs,this.ptks,this.ptjs,this.qpt_zjs,this.qptjs,
this.qwbjs,this.fbqgks,this.fbqgjs,this.skqgks,this.pkqgjs,this.mbjb,this.xcmb,this.fdxq,this.gdjs);
}

@ -1,6 +1,7 @@
package com.dsic.gj_erp.config;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.zaxxer.hikari.HikariDataSource;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
@ -89,7 +90,10 @@ public class JapConfig {
@Bean
public DataSourceInitializer manDataSourceInitializer() {//6
DataSourceInitializer dsInitializer = new DataSourceInitializer();
dsInitializer.setDataSource(jpaDataSource());
HikariDataSource dataSource = (HikariDataSource) jpaDataSource();
dataSource.setMaximumPoolSize(30);
dataSource.setLeakDetectionThreshold(2000);
dsInitializer.setDataSource(dataSource);
ResourceDatabasePopulator dbPopulator = new ResourceDatabasePopulator();
dsInitializer.setDatabasePopulator(dbPopulator);
dsInitializer.setEnabled(env.getProperty("spring.datasource.master.initialize",

@ -51,6 +51,11 @@ public class DmSygdMxController {
return new ResultBean<>(service.cgjhdhqk(map));
}
@GetMapping("list")
public ResultBean<?> list(String begin,String end){
return new ResultBean<>(ydjhImportService.list(begin,end));
}
@RequestMapping("/getList")
@AuthFunction
public ResultBean getList(@RequestBody DmSygdMx sygd){

@ -60,12 +60,11 @@ public class ExcelJhxfListener extends AnalysisEventListener<JhxfExcel> {
// }
boolean b = ObjConvertUtils.checkObjAllFieldsIsNull(excelDemo);
if(!b && !a){
// boolean b = ObjConvertUtils.checkObjAllFieldsIsNull(excelDemo);
// if(!b && !a){
// datas.add(excelDemo);
// }
datas.add(excelDemo);
}
//

@ -22,6 +22,6 @@ public interface DmSygdxqMapper extends BaseMapper<DmSygdxq> {
List<DmSygdMxLj> getSygdLjMx(String begin,String end);
List<DmSygdMxLj> getSygdLjMx1(String dcch,String pl,String fd);
List<DmSygdMxLj> getSygdLjMx1(String dcch,String pl);
}

@ -0,0 +1,9 @@
package com.dsic.gj_erp.mapper.jhgk;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsic.gj_erp.bean.jhgk.YdjhImport;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface YdjhImportMapper extends BaseMapper<YdjhImport> {
}

@ -21,6 +21,7 @@ import javax.annotation.PostConstruct;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
@Slf4j
@ -59,10 +60,16 @@ public class ApiService {
log.info("账号:{},登录IP:{}",loginBean.getYhdm(),ip);
//String macAddress=IPUtils.getMACAddress(ip);
//84306622
if (!StringUtils.isEmpty(loginBean.getPwd())){
pwd= MD5Util.encrypt(loginBean.getPwd());
}
//admin1账号特殊处理,不知道为什么多个0在密码里面,修改数据库数据影响erp登录
if("admin1".equals(loginBean.getYhdm().toLowerCase(Locale.ROOT))){
pwd+="0";
}
Syuserp syuserp = syuserpRepository.findFirstByYHDMAndPWD(loginBean.getYhdm(), pwd);
if (syuserp == null) {
throw new CustomException(10201, "登陆失败,账号密码错误!");

@ -102,33 +102,29 @@ public class DmSygdMxServiceImpl extends ServiceImpl<DmSygdMxMapper, DmSygdMx> i
}).collect(Collectors.toList());
this.updateBatchById(collect);
//获取已存在作业计划
List<DmYdjh> oldYdjhList = this.ydjhService.list(Wrappers.<DmYdjh>lambdaQuery().between(DmYdjh::getJssj, from, to));
//生成作业计划
List<DmYdjh> dmYdjhs = this.generateYdjh(sygdMxes, oldYdjhList);
List<DmYdjh> dmYdjhs = this.generateYdjh(sygdMxes);
ydjhService.saveOrUpdateBatch(dmYdjhs);
}
}
private List<DmYdjh> generateYdjh(List<DmSygdMx> sygdMxes,List<DmYdjh> oldYdjhList){
Map<String, DmYdjh> collect = new HashMap<>();
oldYdjhList.forEach(item-> collect.put(item.getUniqueData(),item));
return sygdMxes.stream().map(item -> {
DmYdjh dmYdjh = new DmYdjh();
BeanUtil.copyProperties(item, dmYdjh);
private List<DmYdjh> generateYdjh(List<DmSygdMx> sygdMxes){
List<DmYdjh> list=new ArrayList<>();
for(DmSygdMx item:sygdMxes){
DmYdjh dmYdjh = ydjhService.getOne(Wrappers.<DmYdjh>query()
.select("top 1 id,jssj")
.eq("dc_ch",item.getDcCh())
.eq("dc_pl",item.getDcPl())
.eq("tzbh",item.getTzbh())
);
if (dmYdjh != null){
dmYdjh.setId(dmYdjh.getId());
dmYdjh.setJssj(item.getJssj());
dmYdjh.setSljhrq(item.getSlrq());
dmYdjh.setPwjhrq(item.getPwrq());
dmYdjh.setHxjhrq(item.getHxrq());
dmYdjh.setQgjhrq(item.getQgrq());
dmYdjh.setZt("0");
DmYdjh _dmYdjh = collect.get(dmYdjh.getUniqueData());
if (_dmYdjh != null){
dmYdjh.setId(_dmYdjh.getId());
dmYdjh.setZt(_dmYdjh.getZt());
}
dmYdjh.setXzglxq(dmYdjh.getJssj());
if (StrUtil.isAllNotEmpty(dmYdjh.getXzglxq(),dmYdjh.getJssj())){
//状态 2拖期 1提前 3追加
if (dmYdjh.getXzglxq().compareTo(dmYdjh.getJssj())<0){
@ -147,8 +143,10 @@ public class DmSygdMxServiceImpl extends ServiceImpl<DmSygdMxMapper, DmSygdMx> i
if (StrUtil.isEmpty(dmYdjh.getTzbh())){
dmYdjh.setJhlx("3");
}
return dmYdjh;
}).collect(Collectors.toList());
list.add(dmYdjh);
}
}
return list;
}
public Map<String,List<EmGcrlDto>> getMxMap(String begin,String end){

@ -274,9 +274,9 @@ public class DmYdjhServiceImpl extends ServiceImpl<DmYdjhMapper, DmYdjh> impleme
List<String> list = idList.subList(idList.size() / 100 * 100, idList.size());
AtomicInteger index = new AtomicInteger(idList.size() / 100 + 1);
// this.update(new UpdateWrapper<DmYdjh>().set("zt", "2")
// .in("id", list)
// );
this.update(new UpdateWrapper<DmYdjh>().set("zt", "2")
.in("id", list)
);
// 生成 数据
baseMapper.getTzjh(list,bzry,bzrq);
@ -296,9 +296,9 @@ public class DmYdjhServiceImpl extends ServiceImpl<DmYdjhMapper, DmYdjh> impleme
}while (index.get()>1);
}else {
// this.update(new UpdateWrapper<DmYdjh>().set("zt", "2")
// .in("id", idList)
// );
this.update(new UpdateWrapper<DmYdjh>().set("zt", "2")
.in("id", idList)
);
// //修改汇总状态 改为 编制
// baseMapper.xfbc(idList);
// //生成对应零件信息 bom->tzjhLj

@ -0,0 +1,10 @@
package com.dsic.gj_erp.service.jhgk.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsic.gj_erp.bean.jhgk.YdjhImport;
import com.dsic.gj_erp.mapper.jhgk.YdjhImportMapper;
import org.springframework.stereotype.Service;
@Service
public class IYdjhImportService extends ServiceImpl<YdjhImportMapper, YdjhImport> {
}

@ -1,27 +1,23 @@
package com.dsic.gj_erp.service.jhgk.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsic.gj_erp.bean.jcsj.DmBom;
import com.dsic.gj_erp.bean.jhgk.DmSygd;
import com.dsic.gj_erp.bean.jhgk.DmSygdMx;
import com.dsic.gj_erp.bean.jhgk.DmSygdMxLj;
import com.dsic.gj_erp.bean.jhgk.YdjhImport;
import com.dsic.gj_erp.bean.jhgk.excel.JhxfExcel;
import com.dsic.gj_erp.mapper.jhgk.DmSygdMxMapper;
import com.dsic.gj_erp.mapper.jhgk.DmSygdxqMapper;
import com.dsic.gj_erp.service.jhgk.DmSygdMxLjService;
import com.dsic.gj_erp.service.jhgk.DmSygdMxService;
import com.dsic.gj_erp.service.jhgk.DmSygdService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;
import java.util.*;
import java.util.stream.Collectors;
@Service
@ -30,17 +26,27 @@ public class YdjhImportService extends ServiceImpl<DmSygdMxMapper, DmSygdMx> {
private final DmSygdxqMapper sygdxqMapper;
private final DmSygdMxLjService ljService;
private final IYdjhImportService importService;
public List<YdjhImport> list(String begin,String end){
return importService.list(Wrappers.<YdjhImport>lambdaQuery()
.between(YdjhImport::getFdxq, begin, end).or().between(YdjhImport::getQwbjs, begin, end)
.orderByAsc(YdjhImport::getImportIndex)
);
}
@Transactional(rollbackFor = Exception.class)
public void handler(List<JhxfExcel> objList){
List<JhxfExcel> qwb = objList.stream().filter(JhxfExcel::isAvailable)
this.executeYdjhImport(objList);
List<JhxfExcel> qwb = objList.stream()
.filter(item->!item.getDcPl().contains("-"))//去除T型材
.filter(item->!item.getDcPl().contains("/"))//去除T型材
.filter(item->item.getDcFd()!=null)
.filter(item -> item.getDcPl().contains("Q")).collect(Collectors.toList());
this.execute(qwb);
List<JhxfExcel> list = objList.stream().filter(JhxfExcel::isAvailable)
List<JhxfExcel> list = objList.stream()
.filter(item->!item.getDcPl().contains("-"))//去除T型材
.filter(item->!item.getDcPl().contains("/"))//去除T型材
.filter(item->item.getDcFd()!=null)
@ -48,50 +54,83 @@ public class YdjhImportService extends ServiceImpl<DmSygdMxMapper, DmSygdMx> {
this.execute(list);
}
// @Transactional(rollbackFor = Exception.class)
// public void handlerLj(List<DmSygdMx> mxList){
// //处理零件信息
// List<DmSygdMxLj> ljList = sygdxqMapper.getSygdLjMx(begin,end);
// ljList.forEach(lj-> mxList.forEach(mx->{
// if (lj.getDcch().equals(mx.getDcCh())
// &&lj.getPl().equals(mx.getDcPl())
// && (StrUtil.isBlank(lj.getTzbh())||lj.getTzbh().equals(mx.getTzbh()))){
// lj.setParentId(mx.getId());
// }
// }));
// ljService.saveBatch(ljList,500);
// }
/**
* ,使使
*/
@Transactional(rollbackFor = Exception.class)
public void execute(List<JhxfExcel> objList) {
objList.forEach(item->{
if (item.getDcPl().contains("A")){
item.setDcPl(item.getDcPl().replace("A",""));
public void executeYdjhImport(List<JhxfExcel> objList){
Map<String,YdjhImport> map=new HashMap<>();
for (int i=0;i<objList.size();i++){
JhxfExcel item=objList.get(i);
YdjhImport jh = new YdjhImport();
BeanUtil.copyProperties(item, jh);
jh.setImportIndex(i);
YdjhImport _jh = map.get(jh.getDcCh() + jh.getDcPl());
if (_jh!=null){
if (_jh.getFdxq()!=null&&jh.getFdxq()==null){
jh.setFdxq(_jh.getFdxq());
}
if (_jh.getFdxq()==null&&jh.getFdxq()!=null){
_jh.setFdxq(jh.getFdxq());
}
if(_jh.getQwbjs()!=null&&jh.getQwbjs()==null){
jh.setQwbjs(_jh.getQwbjs());
}
if(_jh.getQwbjs()==null&&jh.getQwbjs()!=null){
_jh.setQwbjs(jh.getQwbjs());
}
if (item.getDcPl().contains("B")){
item.setDcPl(item.getDcPl().replace("B",""));
}else {
map.put(jh.getDcCh() + jh.getDcPl(),jh);
}
if (item.getDcPl().contains("C")){
item.setDcPl(item.getDcPl().replace("C",""));
YdjhImport one = importService.getOne(new QueryWrapper<YdjhImport>()
.select("top 1 id")
.eq("dc_ch", jh.getDcCh())
.eq("dc_pl", jh.getDcPl())
.eq("dc_fd", jh.getDcFd())
);
if (ObjUtil.isNotEmpty(one)){
jh.setId(one.getId());
}
importService.saveOrUpdate(jh);
}
}
/**
* ,使使
*/
@Transactional(rollbackFor = Exception.class)
public void execute(List<JhxfExcel> objList) {
for(JhxfExcel item:objList){
if (item.getDcPl().contains("Q")){
item.setDcPl(item.getDcPl().replace("Q",""));
item.setQwbBs(true);
}
try {
String format = String.format("%03d", Integer.parseInt(item.getDcPl()));
item.setDcPl(format);
}catch (Exception ignored){}
String[] dcfd=item.getDcFd().split("\\.");
for (int fdIndex=0;fdIndex<dcfd.length;fdIndex++){
String dcFd=dcfd[fdIndex];
List<DmSygdMx> addList = new ArrayList<>();
boolean outContinueFlag=false;
for(String dcFd:dcfd){
if (!item.isAvailable()) {
baseMapper.delete(new QueryWrapper<DmSygdMx>()
.eq("dc_ch", item.getDcCh())
.eq("dc_pl", item.getDcPl())
.eq("dc_fd", dcFd)
);
addList.add(this.initDefault(item, dcFd));
outContinueFlag=true;
}
}
if (outContinueFlag){
this.saveBatch(addList);
continue;
}
String dcFd=dcfd[0];
baseMapper.delete(new QueryWrapper<DmSygdMx>()
.eq("dc_ch", item.getDcCh())
.eq("dc_pl", item.getDcPl())
@ -102,175 +141,109 @@ public class YdjhImportService extends ServiceImpl<DmSygdMxMapper, DmSygdMx> {
.eq("pl", item.getDcPl())
.eq("fd", dcFd)
);
List<DmSygdMx> addList=new ArrayList<>();
if (!item.isAvailable()){
addList.add(this.initDefault(item,dcFd));
continue;
}
List<DmSygdMxLj> ljList = sygdxqMapper.getSygdLjMx1(item.getDcCh(), item.getDcPl(),dcFd);
List<DmSygdMxLj> ljList = sygdxqMapper.getSygdLjMx1(item.getDcCh(), item.getDcPl());
List<DmSygdMx> sygdMxes;
if (item.getQwbBs()) {
sygdMxes = this.initBySl(item,ljList.stream()
.filter(it->"3".equals(it.getTzbh().substring(5,6)))
sygdMxes = this.initBySl(item, ljList.stream().filter(it -> "3".equals(it.getTzbh().substring(5, 6)))
.collect(Collectors.toList()), dcFd
);
} else {
sygdMxes = this.initBySl(item,ljList.stream()
.filter(it->!"3".equals(it.getTzbh().substring(5,6)))
sygdMxes = this.initBySl(item, ljList.stream().filter(it -> !"3".equals(it.getTzbh().substring(5, 6)))
.collect(Collectors.toList()), dcFd
);
}
addList.addAll(sygdMxes);
int _index=0;
int start=0;
int yklmbs=0;
try {
yklmbs=Integer.parseInt(item.getYklm());
}catch (Exception ignored){}
if (yklmbs>0){
if (!sygdMxes.isEmpty()){
_index+=yklmbs;
if (_index>sygdMxes.size()){
_index=sygdMxes.size();
//throw new ServiceException(10009, StrUtil.format("船号:{},批次:{},一垮龙门板数超过上料张数",item.getDcCh(),item.getDcPl()));
if (item.getPkqgjs() != null) {
List<DmSygdMx> _sygdMxes = sygdMxes.stream().filter(it -> "7".equals(it.getKw())).collect(Collectors.toList());
if (!_sygdMxes.isEmpty()) {
for (DmSygdMx sygdMx : _sygdMxes) {
this.updateByYklm(item, sygdMx);
}
for (int i=start;i<_index;i++){
this.updateByYklm(item,sygdMxes.get(i));
}
start+=yklmbs;
} else {
List<DmSygdMx> list = this.initByYklm(item, yklmbs,ljList,dcFd);
List<DmSygdMxLj> _ljlist = ljList.stream().filter(it -> "7".equals(it.getKw())).collect(Collectors.toList());
List<DmSygdMx> list = this.initByYklm(item, _ljlist, dcFd);
addList.addAll(list);
}
}
int yksk=0;
try {
yksk=Integer.parseInt(item.getYksk());
}catch (Exception ignored){}
if (yksk>0){
if (!sygdMxes.isEmpty()){
_index+=yksk;
if (_index>sygdMxes.size()){
_index=sygdMxes.size();
//throw new ServiceException(10009, StrUtil.format("船号:{},批次:{},一垮数控板数超过上料张数",item.getDcCh(),item.getDcPl()));
}
for (int i=start;i<_index;i++){
this.updateByYksk(item,sygdMxes.get(i));
List<DmSygdMx> _sygdMxes1 = sygdMxes.stream().filter(it -> "8".equals(it.getKw())).collect(Collectors.toList());
if (!_sygdMxes1.isEmpty()) {
for (DmSygdMx dmSygdMx : _sygdMxes1) {
this.updateByYksk(item, dmSygdMx);
}
start+=yksk;
} else {
List<DmSygdMx> list = this.initByYksk(item, yksk,ljList,dcFd);
List<DmSygdMxLj> _ljlist = ljList.stream().filter(it -> "8".equals(it.getKw())).collect(Collectors.toList());
if (!_ljlist.isEmpty()){
List<DmSygdMx> list = this.initByYksk(item, _ljlist, dcFd);
addList.addAll(list);
}
}
int eklmbs=0;
try {
eklmbs=Integer.parseInt(item.getEklmbs());
}catch (Exception ignored){}
if (eklmbs>0){
if (!sygdMxes.isEmpty()){
_index+=eklmbs;
if (_index>sygdMxes.size()){
_index=sygdMxes.size();
//throw new ServiceException(10009, StrUtil.format("船号:{},批次:{},二垮龙门板数超过上料张数",item.getDcCh(),item.getDcPl()));
}
for (int i=start;i<_index;i++){
this.updateByEklm(item,sygdMxes.get(i));
if (item.getLmqgks() != null) {
List<DmSygdMx> _sygdMxes = sygdMxes.stream().filter(it -> "5".equals(it.getKw())).collect(Collectors.toList());
if (!_sygdMxes.isEmpty()) {
for (DmSygdMx sygdMx : _sygdMxes) {
this.updateByEklm(item, sygdMx);
}
start+=eklmbs;
} else {
List<DmSygdMx> list = this.initByEklmbs(item, eklmbs,ljList,dcFd);
List<DmSygdMxLj> _ljlist = ljList.stream().filter(it -> "5".equals(it.getKw())).collect(Collectors.toList());
List<DmSygdMx> list = this.initByEklmbs(item, _ljlist, dcFd);
addList.addAll(list);
}
}
int eksk=0;
try {
eksk=Integer.parseInt(item.getEksk());
}catch (Exception ignored){}
if (eksk>0){
if (!sygdMxes.isEmpty()){
_index+=eksk;
if (_index>sygdMxes.size()){
_index=sygdMxes.size();
//throw new ServiceException(10009, StrUtil.format("船号:{},批次:{},二垮数控板数超过上料张数",item.getDcCh(),item.getDcPl()));
}
for (int i=start;i<_index;i++){
this.updateByEksk(item,sygdMxes.get(i));
if (item.getEkskks() != null) {
List<DmSygdMx> _sygdMxes = sygdMxes.stream().filter(it -> "9".equals(it.getKw())).collect(Collectors.toList());
if (!_sygdMxes.isEmpty()) {
for (DmSygdMx sygdMx : _sygdMxes) {
this.updateByEksk(item, sygdMx);
}
start+=eksk;
} else {
List<DmSygdMx> list = this.initByEksk(item, eksk,ljList,dcFd);
List<DmSygdMxLj> _ljlist = ljList.stream().filter(it -> "9".equals(it.getKw())).collect(Collectors.toList());
List<DmSygdMx> list = this.initByEksk(item, _ljlist, dcFd);
addList.addAll(list);
}
}
int sksk=0;
try {
sksk=Integer.parseInt(item.getSksk());
}catch (Exception ignored){}
if (sksk>0){
if (!sygdMxes.isEmpty()){
_index+=sksk;
if (_index>sygdMxes.size()){
_index=sygdMxes.size();
//throw new ServiceException(10009, StrUtil.format("船号:{},批次:{},三垮数控板数超过上料张数",item.getDcCh(),item.getDcPl()));
}
for (int i=start;i<_index;i++){
this.updateBySksk(item,sygdMxes.get(i));
if (item.getSkskqgks() != null) {
List<DmSygdMx> _sygdMxes = sygdMxes.stream().filter(it -> "14".equals(it.getKw())).collect(Collectors.toList());
if (!_sygdMxes.isEmpty()) {
for (DmSygdMx sygdMx : _sygdMxes) {
this.updateBySksk(item, sygdMx);
}
start+=sksk;
} else {
List<DmSygdMx> list = this.initBySksk(item, sksk,ljList,dcFd);
List<DmSygdMxLj> _ljlist = ljList.stream().filter(it -> "14".equals(it.getKw())).collect(Collectors.toList());
List<DmSygdMx> list = this.initBySksk(item, _ljlist, dcFd);
addList.addAll(list);
}
}
int skpt=0;
try {
skpt=Integer.parseInt(item.getSkpt());
}catch (Exception ignored){}
if (skpt>0){
if (!sygdMxes.isEmpty()){
_index+=skpt;
if (_index>sygdMxes.size()){
_index=sygdMxes.size();
//throw new ServiceException(10009, StrUtil.format("船号:{},批次:{},三垮平铁板数超过上料张数",item.getDcCh(),item.getDcPl()));
}
for (int i=start;i<_index;i++){
this.updateBySkpt(item,sygdMxes.get(i));
if (item.getPtks() != null) {
List<DmSygdMx> _sygdMxes = sygdMxes.stream().filter(it -> "6".equals(it.getKw())).collect(Collectors.toList());
if (!_sygdMxes.isEmpty()) {
for (DmSygdMx sygdMx : _sygdMxes) {
this.updateBySkpt(item, sygdMx);
}
start+=skpt;
} else {
List<DmSygdMx> list = this.initBySkpt(item, skpt,ljList,dcFd);
List<DmSygdMxLj> _ljlist = ljList.stream().filter(it -> "6".equals(it.getKw())).collect(Collectors.toList());
List<DmSygdMx> list = this.initBySkpt(item, _ljlist, dcFd);
addList.addAll(list);
}
}
int skbs=0;
try {
skbs=Integer.parseInt(item.getSkbs());
}catch (Exception ignored){}
if (skbs>0){
if (!sygdMxes.isEmpty()){
_index+=skbs;
if (_index>sygdMxes.size()){
_index=sygdMxes.size();
//throw new ServiceException(10009, StrUtil.format("船号:{},批次:{},三垮数控板数超过上料张数",item.getDcCh(),item.getDcPl()));
}
for (int i=start;i<_index;i++){
this.updateBySkbs(item,sygdMxes.get(i));
if (item.getSkqgks() != null) {
List<DmSygdMx> _sygdMxes = sygdMxes.stream().filter(it -> "15".equals(it.getKw())).collect(Collectors.toList());
if (!_sygdMxes.isEmpty()) {
for (DmSygdMx sygdMx : _sygdMxes) {
this.updateBySkbs(item, sygdMx);
}
start+=skbs;
} else {
List<DmSygdMx> list = this.initBySkbs(item, skbs,ljList,dcFd);
List<DmSygdMxLj> _ljlist = ljList.stream().filter(it -> "15".equals(it.getKw())).collect(Collectors.toList());
List<DmSygdMx> list = this.initBySkbs(item, _ljlist, dcFd);
addList.addAll(list);
}
}
@ -283,9 +256,9 @@ public class YdjhImportService extends ServiceImpl<DmSygdMxMapper, DmSygdMx> {
lj.setParentId(mx.getId());
}
}));
ljService.saveBatch(ljList,500);
ljService.saveBatch(ljList);
}
});
}
private DmSygdMx initDefault(JhxfExcel item,String dcFd){
@ -296,19 +269,15 @@ public class YdjhImportService extends ServiceImpl<DmSygdMxMapper, DmSygdMx> {
dmSygdMx.setJssj(item.getFdxq());
if (item.getQwbBs()){
dmSygdMx.setQbs("1");
dmSygdMx.setJssj(item.getQwbjs());
}
return dmSygdMx;
}
private List<DmSygdMx> initBySl(JhxfExcel item,List<DmSygdMxLj> bomList,String dcFd){
int slbs=0;
try {
slbs=Integer.parseInt(item.getBs1());
}catch (Exception ignored){}
List<DmSygdMx> addList=new ArrayList<>();
if (slbs>0){
if (item.getSl()!=null){
if (bomList.isEmpty()){
DmSygdMx dmSygdMx = this.initDefault(item,dcFd);
addList.add(dmSygdMx);
@ -318,13 +287,11 @@ public class YdjhImportService extends ServiceImpl<DmSygdMxMapper, DmSygdMx> {
Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(DmSygdMxLj::getUniqueData))), ArrayList::new)
);
for(int i=0;i<slbs;i++){
if (i>=list.size()){
break;
}
DmSygdMx init = this.initBySl(item,list.get(i),dcFd);
for (DmSygdMxLj dmSygdMxLj : list) {
DmSygdMx init = this.initBySl(item, dmSygdMxLj, dcFd);
if (item.getQwbBs()) {
init.setQbs("1");
init.setJssj(item.getQwbjs());
}
addList.add(init);
}
@ -332,7 +299,7 @@ public class YdjhImportService extends ServiceImpl<DmSygdMxMapper, DmSygdMx> {
return addList;
}
private List<DmSygdMx> initByYklm(JhxfExcel item,int sl,List<DmSygdMxLj> bomList,String dcFd){
private List<DmSygdMx> initByYklm(JhxfExcel item, List<DmSygdMxLj> bomList, String dcFd){
List<DmSygdMx> addList=new ArrayList<>();
if (bomList.isEmpty()){
DmSygdMx dmSygdMx = this.initDefault(item,dcFd);
@ -343,20 +310,18 @@ public class YdjhImportService extends ServiceImpl<DmSygdMxMapper, DmSygdMx> {
Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(DmSygdMxLj::getUniqueData))), ArrayList::new)
);
for(int i=0;i<sl;i++){
if (i>=list.size()){
break;
}
DmSygdMx init = this.initByYklm(item,list.get(i),dcFd);
for (DmSygdMxLj dmSygdMxLj : list) {
DmSygdMx init = this.initByYklm(item, dmSygdMxLj, dcFd);
if (item.getQwbBs()) {
init.setQbs("1");
init.setJssj(item.getQwbjs());
}
addList.add(init);
}
return addList;
}
private List<DmSygdMx> initByYksk(JhxfExcel item,int sl,List<DmSygdMxLj> bomList,String dcFd){
private List<DmSygdMx> initByYksk(JhxfExcel item, List<DmSygdMxLj> bomList, String dcFd){
List<DmSygdMx> addList=new ArrayList<>();
if (bomList.isEmpty()){
DmSygdMx dmSygdMx = this.initDefault(item,dcFd);
@ -367,20 +332,18 @@ public class YdjhImportService extends ServiceImpl<DmSygdMxMapper, DmSygdMx> {
Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(DmSygdMxLj::getUniqueData))), ArrayList::new)
);
for(int i=0;i<sl;i++){
if (i>=list.size()){
break;
}
DmSygdMx init = this.initByYksk(item,list.get(i),dcFd);
for (DmSygdMxLj dmSygdMxLj : list) {
DmSygdMx init = this.initByYksk(item, dmSygdMxLj, dcFd);
if (item.getQwbBs()) {
init.setQbs("1");
init.setJssj(item.getQwbjs());
}
addList.add(init);
}
return addList;
}
private List<DmSygdMx> initByEklmbs(JhxfExcel item,int sl,List<DmSygdMxLj> bomList,String dcFd){
private List<DmSygdMx> initByEklmbs(JhxfExcel item, List<DmSygdMxLj> bomList, String dcFd){
List<DmSygdMx> addList=new ArrayList<>();
if (bomList.isEmpty()){
DmSygdMx dmSygdMx = this.initDefault(item,dcFd);
@ -391,20 +354,18 @@ public class YdjhImportService extends ServiceImpl<DmSygdMxMapper, DmSygdMx> {
Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(DmSygdMxLj::getUniqueData))), ArrayList::new)
);
for(int i=0;i<sl;i++){
if (i>=list.size()){
break;
}
DmSygdMx init = this.initByEklmbs(item,list.get(i),dcFd);
for (DmSygdMxLj dmSygdMxLj : list) {
DmSygdMx init = this.initByEklmbs(item, dmSygdMxLj, dcFd);
if (item.getQwbBs()) {
init.setQbs("1");
init.setJssj(item.getQwbjs());
}
addList.add(init);
}
return addList;
}
private List<DmSygdMx> initByEksk(JhxfExcel item,int sl,List<DmSygdMxLj> bomList,String dcFd){
private List<DmSygdMx> initByEksk(JhxfExcel item, List<DmSygdMxLj> bomList, String dcFd){
List<DmSygdMx> addList=new ArrayList<>();
if (bomList.isEmpty()){
DmSygdMx dmSygdMx = this.initDefault(item,dcFd);
@ -415,20 +376,18 @@ public class YdjhImportService extends ServiceImpl<DmSygdMxMapper, DmSygdMx> {
Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(DmSygdMxLj::getUniqueData))), ArrayList::new)
);
for(int i=0;i<sl;i++){
if (i>=list.size()){
break;
}
DmSygdMx init = this.initByEksk(item,list.get(i),dcFd);
for (DmSygdMxLj dmSygdMxLj : list) {
DmSygdMx init = this.initByEksk(item, dmSygdMxLj, dcFd);
if (item.getQwbBs()) {
init.setQbs("1");
init.setJssj(item.getQwbjs());
}
addList.add(init);
}
return addList;
}
private List<DmSygdMx> initBySksk(JhxfExcel item,int sl,List<DmSygdMxLj> bomList,String dcFd){
private List<DmSygdMx> initBySksk(JhxfExcel item, List<DmSygdMxLj> bomList, String dcFd){
List<DmSygdMx> addList=new ArrayList<>();
if (bomList.isEmpty()){
DmSygdMx dmSygdMx = this.initDefault(item,dcFd);
@ -439,20 +398,18 @@ public class YdjhImportService extends ServiceImpl<DmSygdMxMapper, DmSygdMx> {
Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(DmSygdMxLj::getUniqueData))), ArrayList::new)
);
for(int i=0;i<sl;i++){
if (i>=list.size()){
break;
}
DmSygdMx init = this.initBySksk(item,list.get(i),dcFd);
for (DmSygdMxLj dmSygdMxLj : list) {
DmSygdMx init = this.initBySksk(item, dmSygdMxLj, dcFd);
if (item.getQwbBs()) {
init.setQbs("1");
init.setJssj(item.getQwbjs());
}
addList.add(init);
}
return addList;
}
private List<DmSygdMx> initBySkpt(JhxfExcel item,int sl,List<DmSygdMxLj> bomList,String dcFd){
private List<DmSygdMx> initBySkpt(JhxfExcel item, List<DmSygdMxLj> bomList, String dcFd){
List<DmSygdMx> addList=new ArrayList<>();
if (bomList.isEmpty()){
DmSygdMx dmSygdMx = this.initDefault(item,dcFd);
@ -463,20 +420,18 @@ public class YdjhImportService extends ServiceImpl<DmSygdMxMapper, DmSygdMx> {
Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(DmSygdMxLj::getUniqueData))), ArrayList::new)
);
for(int i=0;i<sl;i++){
if (i>=list.size()){
break;
}
DmSygdMx init = this.initBySkpt(item,list.get(i),dcFd);
for (DmSygdMxLj dmSygdMxLj : list) {
DmSygdMx init = this.initBySkpt(item, dmSygdMxLj, dcFd);
if (item.getQwbBs()) {
init.setQbs("1");
init.setJssj(item.getQwbjs());
}
addList.add(init);
}
return addList;
}
private List<DmSygdMx> initBySkbs(JhxfExcel item,int sl,List<DmSygdMxLj> bomList,String dcFd){
private List<DmSygdMx> initBySkbs(JhxfExcel item, List<DmSygdMxLj> bomList, String dcFd){
List<DmSygdMx> addList=new ArrayList<>();
if (bomList.isEmpty()){
DmSygdMx dmSygdMx = this.initDefault(item,dcFd);
@ -487,13 +442,11 @@ public class YdjhImportService extends ServiceImpl<DmSygdMxMapper, DmSygdMx> {
Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(DmSygdMxLj::getUniqueData))), ArrayList::new)
);
for(int i=0;i<sl;i++){
if (i>=list.size()){
break;
}
DmSygdMx init = this.initBySkbs(item,list.get(i),dcFd);
for (DmSygdMxLj dmSygdMxLj : list) {
DmSygdMx init = this.initBySkbs(item, dmSygdMxLj, dcFd);
if (item.getQwbBs()) {
init.setQbs("1");
init.setJssj(item.getQwbjs());
}
addList.add(init);
}
@ -549,6 +502,9 @@ public class YdjhImportService extends ServiceImpl<DmSygdMxMapper, DmSygdMx> {
private DmSygdMx initByYklm(JhxfExcel item, DmSygdMxLj bom,String dcFd){
DmSygdMx dmSygdMx = DmSygdMx.ofWithDmSygdMxlj(bom);
dmSygdMx.setDcFd(dcFd);
dmSygdMx.setSlrq(item.getSl());
dmSygdMx.setXcpw(item.getXcpw());
dmSygdMx.setPwrq(item.getPw());
this.updateByYklm(item,dmSygdMx);
return dmSygdMx;
}
@ -556,6 +512,9 @@ public class YdjhImportService extends ServiceImpl<DmSygdMxMapper, DmSygdMx> {
private DmSygdMx initByYksk(JhxfExcel item, DmSygdMxLj bom,String dcFd){
DmSygdMx dmSygdMx = DmSygdMx.ofWithDmSygdMxlj(bom);
dmSygdMx.setDcFd(dcFd);
dmSygdMx.setSlrq(item.getSl());
dmSygdMx.setXcpw(item.getXcpw());
dmSygdMx.setPwrq(item.getPw());
this.updateByYksk(item,dmSygdMx);
return dmSygdMx;
}
@ -563,6 +522,9 @@ public class YdjhImportService extends ServiceImpl<DmSygdMxMapper, DmSygdMx> {
private DmSygdMx initByEklmbs(JhxfExcel item, DmSygdMxLj bom,String dcFd){
DmSygdMx dmSygdMx = DmSygdMx.ofWithDmSygdMxlj(bom);
dmSygdMx.setDcFd(dcFd);
dmSygdMx.setSlrq(item.getSl());
dmSygdMx.setXcpw(item.getXcpw());
dmSygdMx.setPwrq(item.getPw());
this.updateByEklm(item,dmSygdMx);
return dmSygdMx;
}
@ -570,6 +532,9 @@ public class YdjhImportService extends ServiceImpl<DmSygdMxMapper, DmSygdMx> {
private DmSygdMx initByEksk(JhxfExcel item, DmSygdMxLj bom,String dcFd){
DmSygdMx dmSygdMx = DmSygdMx.ofWithDmSygdMxlj(bom);
dmSygdMx.setDcFd(dcFd);
dmSygdMx.setSlrq(item.getSl());
dmSygdMx.setXcpw(item.getXcpw());
dmSygdMx.setPwrq(item.getPw());
this.updateByEksk(item,dmSygdMx);
return dmSygdMx;
}
@ -577,6 +542,9 @@ public class YdjhImportService extends ServiceImpl<DmSygdMxMapper, DmSygdMx> {
private DmSygdMx initBySksk(JhxfExcel item, DmSygdMxLj bom,String dcFd){
DmSygdMx dmSygdMx = DmSygdMx.ofWithDmSygdMxlj(bom);
dmSygdMx.setDcFd(dcFd);
dmSygdMx.setSlrq(item.getSl());
dmSygdMx.setXcpw(item.getXcpw());
dmSygdMx.setPwrq(item.getPw());
this.updateBySksk(item,dmSygdMx);
return dmSygdMx;
}
@ -584,6 +552,9 @@ public class YdjhImportService extends ServiceImpl<DmSygdMxMapper, DmSygdMx> {
private DmSygdMx initBySkpt(JhxfExcel item, DmSygdMxLj bom,String dcFd){
DmSygdMx dmSygdMx = DmSygdMx.ofWithDmSygdMxlj(bom);
dmSygdMx.setDcFd(dcFd);
dmSygdMx.setSlrq(item.getSl());
dmSygdMx.setXcpw(item.getXcpw());
dmSygdMx.setPwrq(item.getPw());
this.updateBySkpt(item,dmSygdMx);
return dmSygdMx;
}
@ -591,6 +562,9 @@ public class YdjhImportService extends ServiceImpl<DmSygdMxMapper, DmSygdMx> {
private DmSygdMx initBySkbs(JhxfExcel item, DmSygdMxLj bom,String dcFd){
DmSygdMx dmSygdMx = DmSygdMx.ofWithDmSygdMxlj(bom);
dmSygdMx.setDcFd(dcFd);
dmSygdMx.setSlrq(item.getSl());
dmSygdMx.setXcpw(item.getXcpw());
dmSygdMx.setPwrq(item.getPw());
this.updateBySkbs(item,dmSygdMx);
return dmSygdMx;
}

@ -43,6 +43,7 @@ public class XiaoChiService{
});
Map<Integer,Device> deviceMap=new HashMap<>();
devices.forEach(item-> deviceMap.put(item.getId(),item));
log.info("========开始执行小池同步定时功能=========");
this.exeAuto(userMap,deviceMap);
//this.exe(userMap,deviceMap);
}
@ -91,11 +92,14 @@ public class XiaoChiService{
private void exeAuto(Map<String, XiaochiUser> userMap,Map<Integer,Device> deviceMap){
//CronUtil默认为分钟,目前未使用CronUtil.setMatchSecond(true)启动秒级任务,以下表示每30分钟执行一次
//每30分钟执行一次,获取小池今日加工并且未更新切割计划派工单的数据去更新派工单
CronUtil.schedule("* */10 * * * *", (Task) () -> {
CronUtil.schedule("0 */10 * * * ?", (Task) () -> {
this.exe(userMap,deviceMap);
});
CronUtil.setMatchSecond(true);
if (!CronUtil.getScheduler().isStarted()){
CronUtil.start();
}
}
// @PostConstruct
public void synBom_qgPgd(){

@ -90,19 +90,21 @@ public class WebSocketService extends TextWebSocketHandler {
}
this.scheduleStartFlag=true;
}
CronUtil.schedule("*/20 * * * * *", (Task) () -> {
CronUtil.schedule("*/15 * * * * ?", (Task) () -> {
try {
System.out.println("心跳");
this.sendMessage(message.toString());
} catch (Exception e) {
e.printStackTrace();
this.connect(this.url);
}
});
// 支持秒级别定时任务
CronUtil.setMatchSecond(true);
if (!CronUtil.getScheduler().isStarted()){
CronUtil.start();
}
}
@Override

@ -231,7 +231,7 @@
ROW_NUMBER() over(PARTITION by dc_ch ,dc_pl,tzbh order by tzbh) rn from dm_bchxylp) a where a.rn=1) bc
on dm_bom.dcch =bc.dc_ch and dm_bom.pl =bc.dc_pl and dm_bom.tzbh =bc.tzbh
where
dm_bom.type = 'b' and dm_sygdxq.dc_ch=#{dcch} and dm_sygdxq.dc_pl=#{pl} and dm_sygdxq.dc_fd=#{fd}
dm_bom.type = 'b' and dm_sygdxq.dc_ch=#{dcch} and dm_sygdxq.dc_pl=#{pl}
ORDER BY dm_sygdxq.xzglxq,dm_sygdxq.DC_CH,dm_sygdxq.DC_PL,dm_bom.TZBH,dm_sygdxq.DC_FD
</select>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dsic.gj_erp.mapper.jhgk.YdjhImportMapper">
</mapper>
Loading…
Cancel
Save