diff --git a/op-api/op-api-system/src/main/java/com/op/system/api/domain/sap/SapWorkCenter.java b/op-api/op-api-system/src/main/java/com/op/system/api/domain/sap/SapWorkCenter.java index ad7843f1..98dfbfb9 100644 --- a/op-api/op-api-system/src/main/java/com/op/system/api/domain/sap/SapWorkCenter.java +++ b/op-api/op-api-system/src/main/java/com/op/system/api/domain/sap/SapWorkCenter.java @@ -11,9 +11,19 @@ public class SapWorkCenter { private String arbpl;//工作中心 private String ktext;//工作中心描述 private String parentId; + private String fType; + @JsonFormat(pattern = "yyyy-MM-dd") private Date aedat_grnd;//更新日期 + public String getfType() { + return fType; + } + + public void setfType(String fType) { + this.fType = fType; + } + public String getWeeks() { return weeks; } diff --git a/op-modules/op-file/src/main/resources/bootstrap.yml b/op-modules/op-file/src/main/resources/bootstrap.yml index 3cc00fca..4761653f 100644 --- a/op-modules/op-file/src/main/resources/bootstrap.yml +++ b/op-modules/op-file/src/main/resources/bootstrap.yml @@ -1,7 +1,6 @@ # Tomcat server: port: 9300 - # Spring spring: application: @@ -29,3 +28,7 @@ spring: # 共享配置 shared-configs: - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + servlet: + multipart: + max-file-size: 50MB + max-request-size: 50MB diff --git a/op-modules/op-quality/src/main/java/com/op/quality/controller/QcCheckTaskIncomeController.java b/op-modules/op-quality/src/main/java/com/op/quality/controller/QcCheckTaskIncomeController.java index 91c07a4e..b9325b92 100644 --- a/op-modules/op-quality/src/main/java/com/op/quality/controller/QcCheckTaskIncomeController.java +++ b/op-modules/op-quality/src/main/java/com/op/quality/controller/QcCheckTaskIncomeController.java @@ -61,10 +61,10 @@ public class QcCheckTaskIncomeController extends BaseController { qcCheckTaskIncome.setIncomeTimeEnd(dateEndStr);//end } - if(StringUtils.isEmpty(qcCheckTaskIncome.getCheckTimeStart())){ - qcCheckTaskIncome.setCheckTimeStart(qcCheckTaskIncome.getIncomeTimeStart());//start - qcCheckTaskIncome.setCheckTimeEnd(qcCheckTaskIncome.getIncomeTimeStart());//end - } +// if(StringUtils.isEmpty(qcCheckTaskIncome.getCheckTimeStart())){ +// qcCheckTaskIncome.setCheckTimeStart(qcCheckTaskIncome.getIncomeTimeStart());//start +// qcCheckTaskIncome.setCheckTimeEnd(qcCheckTaskIncome.getIncomeTimeStart());//end +// } startPage(); List list = qcCheckTaskIncomeService.selectQcCheckTaskIncomeList(qcCheckTaskIncome); diff --git a/op-modules/op-quality/src/main/java/com/op/quality/controller/QcCheckTaskProduceController.java b/op-modules/op-quality/src/main/java/com/op/quality/controller/QcCheckTaskProduceController.java index 3296d3eb..06855435 100644 --- a/op-modules/op-quality/src/main/java/com/op/quality/controller/QcCheckTaskProduceController.java +++ b/op-modules/op-quality/src/main/java/com/op/quality/controller/QcCheckTaskProduceController.java @@ -6,6 +6,7 @@ import java.util.List; import javax.servlet.http.HttpServletResponse; import com.op.common.core.utils.DateUtils; +import com.op.quality.domain.QcCheckType; import com.op.quality.domain.QcSupplier; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -56,10 +57,10 @@ public class QcCheckTaskProduceController extends BaseController { qcCheckTaskProduce.setProduceDateEnd(dateEndStr);//end } - if(StringUtils.isEmpty(qcCheckTaskProduce.getCheckTimeStart())){ - qcCheckTaskProduce.setCheckTimeStart(qcCheckTaskProduce.getProduceDateStart());//start - qcCheckTaskProduce.setCheckTimeEnd(qcCheckTaskProduce.getProduceDateEnd());//end - } +// if(StringUtils.isEmpty(qcCheckTaskProduce.getCheckTimeStart())){ +// qcCheckTaskProduce.setCheckTimeStart(qcCheckTaskProduce.getProduceDateStart());//start +// qcCheckTaskProduce.setCheckTimeEnd(qcCheckTaskProduce.getProduceDateEnd());//end +// } startPage(); List list = qcCheckTaskProduceService.selectQcCheckTaskProduceList(qcCheckTaskProduce); @@ -110,7 +111,11 @@ public class QcCheckTaskProduceController extends BaseController { @Log(title = "生产过程检验任务", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody QcCheckTaskProduce qcCheckTaskProduce) { - return toAjax(qcCheckTaskProduceService.insertQcCheckTaskProduce(qcCheckTaskProduce)); + int r = qcCheckTaskProduceService.insertQcCheckTaskProduce(qcCheckTaskProduce); + if(r>0){ + return toAjax(r); + } + return error("添加失败:请检查物料的关联检测项"); } /** @@ -142,4 +147,9 @@ public class QcCheckTaskProduceController extends BaseController { List list = qcCheckTaskProduceService.getQcListWorkCenter(qcCheckTaskProduce); return getDataTable(list); } + @GetMapping("/getCheckTypes") + public List getCheckTypes(QcCheckType qcCheckType) { + return qcCheckTaskProduceService.getCheckTypes(qcCheckType); + } + } diff --git a/op-modules/op-quality/src/main/java/com/op/quality/domain/QcCheckTaskProduce.java b/op-modules/op-quality/src/main/java/com/op/quality/domain/QcCheckTaskProduce.java index 5777afb4..65bcbaca 100644 --- a/op-modules/op-quality/src/main/java/com/op/quality/domain/QcCheckTaskProduce.java +++ b/op-modules/op-quality/src/main/java/com/op/quality/domain/QcCheckTaskProduce.java @@ -57,8 +57,8 @@ public class QcCheckTaskProduce extends BaseEntity { private String carName; /** 生产时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "生产时间", width = 30, dateFormat = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "生产时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date produceDate; /** 检测地点 */ @@ -118,6 +118,16 @@ public class QcCheckTaskProduce extends BaseEntity { private String checkTimeStart; private String checkTimeEnd; + private String checkType; + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + public String getProduceDateStart() { return produceDateStart; } diff --git a/op-modules/op-quality/src/main/java/com/op/quality/mapper/QcCheckTaskProduceMapper.java b/op-modules/op-quality/src/main/java/com/op/quality/mapper/QcCheckTaskProduceMapper.java index b28e517c..249cee68 100644 --- a/op-modules/op-quality/src/main/java/com/op/quality/mapper/QcCheckTaskProduceMapper.java +++ b/op-modules/op-quality/src/main/java/com/op/quality/mapper/QcCheckTaskProduceMapper.java @@ -3,17 +3,20 @@ package com.op.quality.mapper; import java.util.List; import com.op.quality.domain.QcCheckTaskProduce; +import com.op.quality.domain.QcCheckType; +import org.apache.ibatis.annotations.Mapper; /** * 生产过程检验任务Mapper接口 - * + * * @author Open Platform * @date 2023-10-19 */ +@Mapper public interface QcCheckTaskProduceMapper { /** * 查询生产过程检验任务 - * + * * @param recordId 生产过程检验任务主键 * @return 生产过程检验任务 */ @@ -21,7 +24,7 @@ public interface QcCheckTaskProduceMapper { /** * 查询生产过程检验任务列表 - * + * * @param qcCheckTaskProduce 生产过程检验任务 * @return 生产过程检验任务集合 */ @@ -29,7 +32,7 @@ public interface QcCheckTaskProduceMapper { /** * 新增生产过程检验任务 - * + * * @param qcCheckTaskProduce 生产过程检验任务 * @return 结果 */ @@ -37,7 +40,7 @@ public interface QcCheckTaskProduceMapper { /** * 修改生产过程检验任务 - * + * * @param qcCheckTaskProduce 生产过程检验任务 * @return 结果 */ @@ -45,7 +48,7 @@ public interface QcCheckTaskProduceMapper { /** * 删除生产过程检验任务 - * + * * @param recordId 生产过程检验任务主键 * @return 结果 */ @@ -53,9 +56,15 @@ public interface QcCheckTaskProduceMapper { /** * 批量删除生产过程检验任务 - * + * * @param recordIds 需要删除的数据主键集合 * @return 结果 */ public int deleteQcCheckTaskProduceByRecordIds(String[] recordIds); + + public List getQcListWorkCenter(QcCheckTaskProduce qcCheckTaskProduce); + + int getTodayMaxNum(QcCheckTaskProduce qcCheckTaskProduce); + + List getCheckTypes(QcCheckType qcCheckType); } diff --git a/op-modules/op-quality/src/main/java/com/op/quality/service/IQcCheckTaskProduceService.java b/op-modules/op-quality/src/main/java/com/op/quality/service/IQcCheckTaskProduceService.java index 97ecdbca..b877c94a 100644 --- a/op-modules/op-quality/src/main/java/com/op/quality/service/IQcCheckTaskProduceService.java +++ b/op-modules/op-quality/src/main/java/com/op/quality/service/IQcCheckTaskProduceService.java @@ -2,6 +2,7 @@ package com.op.quality.service; import java.util.List; import com.op.quality.domain.QcCheckTaskProduce; +import com.op.quality.domain.QcCheckType; /** * 生产过程检验任务Service接口 @@ -59,4 +60,6 @@ public interface IQcCheckTaskProduceService { public int deleteQcCheckTaskProduceByRecordId(String recordId); List getQcListWorkCenter(QcCheckTaskProduce qcCheckTaskProduce); + + List getCheckTypes(QcCheckType qcCheckType); } diff --git a/op-modules/op-quality/src/main/java/com/op/quality/service/impl/QcCheckTaskIncomeServiceImpl.java b/op-modules/op-quality/src/main/java/com/op/quality/service/impl/QcCheckTaskIncomeServiceImpl.java index 9ed1ca73..616e5d07 100644 --- a/op-modules/op-quality/src/main/java/com/op/quality/service/impl/QcCheckTaskIncomeServiceImpl.java +++ b/op-modules/op-quality/src/main/java/com/op/quality/service/impl/QcCheckTaskIncomeServiceImpl.java @@ -65,6 +65,7 @@ public class QcCheckTaskIncomeServiceImpl implements IQcCheckTaskIncomeService { @Override @DS("#header.poolName") public List selectQcCheckTaskIncomeList(QcCheckTaskIncome qcCheckTaskIncome) { + qcCheckTaskIncome.setDelFlag("0"); return qcCheckTaskIncomeMapper.selectQcCheckTaskIncomeList(qcCheckTaskIncome); } diff --git a/op-modules/op-quality/src/main/java/com/op/quality/service/impl/QcCheckTaskProduceServiceImpl.java b/op-modules/op-quality/src/main/java/com/op/quality/service/impl/QcCheckTaskProduceServiceImpl.java index 4cf7a889..f5585fcc 100644 --- a/op-modules/op-quality/src/main/java/com/op/quality/service/impl/QcCheckTaskProduceServiceImpl.java +++ b/op-modules/op-quality/src/main/java/com/op/quality/service/impl/QcCheckTaskProduceServiceImpl.java @@ -1,14 +1,25 @@ package com.op.quality.service.impl; +import java.util.Date; import java.util.List; import com.baomidou.dynamic.datasource.annotation.DS; import com.op.common.core.utils.DateUtils; +import com.op.common.core.utils.uuid.IdUtils; +import com.op.common.security.utils.SecurityUtils; +import com.op.quality.domain.*; +import com.op.quality.mapper.QcCheckTaskDetailMapper; +import com.op.quality.mapper.QcCheckTypeProjectMapper; +import com.op.quality.mapper.QcMaterialGroupDetailMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.op.quality.mapper.QcCheckTaskProduceMapper; -import com.op.quality.domain.QcCheckTaskProduce; import com.op.quality.service.IQcCheckTaskProduceService; +import org.springframework.util.CollectionUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; /** * 生产过程检验任务Service业务层处理 @@ -21,6 +32,15 @@ public class QcCheckTaskProduceServiceImpl implements IQcCheckTaskProduceService @Autowired private QcCheckTaskProduceMapper qcCheckTaskProduceMapper; + @Autowired + private QcCheckTypeProjectMapper qcCheckTypeProjectMapper; + + @Autowired + private QcMaterialGroupDetailMapper qcMaterialGroupDetailMapper; + + @Autowired + private QcCheckTaskDetailMapper qcCheckTaskDetailMapper; + /** * 查询生产过程检验任务 * @@ -42,6 +62,7 @@ public class QcCheckTaskProduceServiceImpl implements IQcCheckTaskProduceService @Override @DS("#header.poolName") public List selectQcCheckTaskProduceList(QcCheckTaskProduce qcCheckTaskProduce) { + qcCheckTaskProduce.setDelFlag("0"); return qcCheckTaskProduceMapper.selectQcCheckTaskProduceList(qcCheckTaskProduce); } @@ -55,7 +76,58 @@ public class QcCheckTaskProduceServiceImpl implements IQcCheckTaskProduceService @DS("#header.poolName") public int insertQcCheckTaskProduce(QcCheckTaskProduce qcCheckTaskProduce) { qcCheckTaskProduce.setCreateTime(DateUtils.getNowDate()); - return qcCheckTaskProduceMapper.insertQcCheckTaskProduce(qcCheckTaskProduce); + + + String bpDD = DateUtils.parseDateToStr(DateUtils.YYYYMMDD, DateUtils.getNowDate()); + int liushuiNum = qcCheckTaskProduceMapper.getTodayMaxNum(qcCheckTaskProduce); + String liushuiStr = String.format("%04d", liushuiNum); + + String createBy = SecurityUtils.getUsername(); + Date nowDate= DateUtils.getNowDate(); + //获取当前所选工厂 + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String key = "#header.poolName"; + String factoryCode = request.getHeader(key.substring(8)).replace("ds_",""); + + qcCheckTaskProduce.setCheckNo(bpDD+liushuiStr); + + /**qc_check_task_income**/ + String beLongId = IdUtils.fastSimpleUUID(); + qcCheckTaskProduce.setRecordId(beLongId); + qcCheckTaskProduce.setFactoryCode(factoryCode); + qcCheckTaskProduce.setCreateTime(nowDate); + qcCheckTaskProduceMapper.insertQcCheckTaskProduce(qcCheckTaskProduce); + + /**取检测项**/ + QcCheckTypeProject qctp= new QcCheckTypeProject(); + qctp.setTypeId(qcCheckTaskProduce.getCheckType());//来料检验 + qctp.setMaterialCode(qcCheckTaskProduce.getMaterialCode());//特性 + /**qc_check_type_project**/ + List items = qcCheckTypeProjectMapper.getTPByTypeMaterial(qctp); + if(CollectionUtils.isEmpty(items)){ + /**qc_material_group_detail**/ + QcMaterialGroupDetail group = qcMaterialGroupDetailMapper.getGroupByMaterial(qcCheckTaskProduce.getMaterialCode()); + if(group == null){ + return 0;//没有找到检测项目 + } + qctp.setGroupId(group.getGroupId());//共性 + items = qcCheckTypeProjectMapper.getTPByTypeGroup(qctp); + } + + /**qc_check_task_detail**/ + if(CollectionUtils.isEmpty(items)){ + return 0;//没有找到检测项目 + } + + for(QcCheckTaskDetail item:items){ + item.setRecordId(IdUtils.fastSimpleUUID()); + item.setBelongTo(beLongId); + item.setCreateTime(nowDate); + item.setCreateBy(createBy); + item.setFactoryCode(factoryCode); + item.setStatus("Y"); + } + return qcCheckTaskDetailMapper.addBatch(items); } /** @@ -96,8 +168,16 @@ public class QcCheckTaskProduceServiceImpl implements IQcCheckTaskProduceService } @Override + @DS("#header.poolName") public List getQcListWorkCenter(QcCheckTaskProduce qcCheckTaskProduce) { - return null; + return qcCheckTaskProduceMapper.getQcListWorkCenter(qcCheckTaskProduce); + } + + @Override + @DS("#header.poolName") + public List getCheckTypes(QcCheckType qcCheckType) { + qcCheckType.setTypeCode("produce"); + return qcCheckTaskProduceMapper.getCheckTypes(qcCheckType); } diff --git a/op-modules/op-quality/src/main/resources/mapper/quality/QcCheckTaskIncomeMapper.xml b/op-modules/op-quality/src/main/resources/mapper/quality/QcCheckTaskIncomeMapper.xml index d4309ebf..5dc6e13d 100644 --- a/op-modules/op-quality/src/main/resources/mapper/quality/QcCheckTaskIncomeMapper.xml +++ b/op-modules/op-quality/src/main/resources/mapper/quality/QcCheckTaskIncomeMapper.xml @@ -59,6 +59,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and check_time = #{checkTime} and check_result = #{checkResult} and status = #{status} + and del_flag = #{delFlag} and attr1 = #{attr1} and attr2 = #{attr2} and attr3 = #{attr3} diff --git a/op-modules/op-quality/src/main/resources/mapper/quality/QcCheckTaskProduceMapper.xml b/op-modules/op-quality/src/main/resources/mapper/quality/QcCheckTaskProduceMapper.xml index 877db21b..aca191ae 100644 --- a/op-modules/op-quality/src/main/resources/mapper/quality/QcCheckTaskProduceMapper.xml +++ b/op-modules/op-quality/src/main/resources/mapper/quality/QcCheckTaskProduceMapper.xml @@ -36,7 +36,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select record_id, check_no, batch_no, order_no, material_code, material_name, quality, unit, car_code, car_name, produce_date, check_loc, check_status, check_man_code, check_man_name, check_time, check_result, status, attr1, attr2, attr3, attr4, create_by, create_time, update_by, update_time, factory_code, del_flag from qc_check_task_produce + select record_id, check_no, batch_no, order_no, material_code, material_name, + quality, unit, car_code, car_name, produce_date, check_loc, check_status, + check_man_code, check_man_name, check_time, check_result, status, attr1, + attr2, attr3, attr4, create_by, create_time, update_by, update_time, + factory_code, del_flag from qc_check_task_produce + + + + insert into qc_check_task_produce diff --git a/op-modules/op-sap/src/main/java/com/op/sap/service/impl/SapWorkCenterServiceImpl.java b/op-modules/op-sap/src/main/java/com/op/sap/service/impl/SapWorkCenterServiceImpl.java index 6e90bd06..69784f2a 100644 --- a/op-modules/op-sap/src/main/java/com/op/sap/service/impl/SapWorkCenterServiceImpl.java +++ b/op-modules/op-sap/src/main/java/com/op/sap/service/impl/SapWorkCenterServiceImpl.java @@ -287,6 +287,7 @@ public class SapWorkCenterServiceImpl implements SapWorkCenterService { String parentId = sapBomMapper.getParentId(adds.get(0).getWeeks()); adds.stream().forEach(e->{ e.setParentId(parentId); + e.setfType("c"); }); int n = sapBomMapper.addFactoryBatchs(adds); System.out.println("工作中心新增成功条数:"+ n); diff --git a/op-modules/op-sap/src/main/resources/mapper/sap/SapBomMapper.xml b/op-modules/op-sap/src/main/resources/mapper/sap/SapBomMapper.xml index f2e1a85c..b7f9c979 100644 --- a/op-modules/op-sap/src/main/resources/mapper/sap/SapBomMapper.xml +++ b/op-modules/op-sap/src/main/resources/mapper/sap/SapBomMapper.xml @@ -243,13 +243,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" (parent_id,factory_name,factory_code, create_by, create_time, - update_time) + update_time, + f_type + ) VALUES (#{item.parentId},#{item.ktext},#{item.arbpl}, 'job', #{item.aedat_grnd}, - #{item.aedat_grnd}) + #{item.aedat_grnd}, + #{item.fType} + ) diff --git a/op-modules/op-system/src/main/java/com/op/system/domain/BaseApkFile.java b/op-modules/op-system/src/main/java/com/op/system/domain/BaseApkFile.java index e5ba184f..b96ce35c 100644 --- a/op-modules/op-system/src/main/java/com/op/system/domain/BaseApkFile.java +++ b/op-modules/op-system/src/main/java/com/op/system/domain/BaseApkFile.java @@ -45,6 +45,16 @@ public class BaseApkFile extends BaseEntity { @Excel(name = "备用4") private String attr4; + private String fileList; + + public String getFileList() { + return fileList; + } + + public void setFileList(String fileList) { + this.fileList = fileList; + } + public void setId(String id) { this.id = id; } diff --git a/op-modules/op-system/src/main/java/com/op/system/service/impl/BaseApkFileServiceImpl.java b/op-modules/op-system/src/main/java/com/op/system/service/impl/BaseApkFileServiceImpl.java index c8a04a94..984650b8 100644 --- a/op-modules/op-system/src/main/java/com/op/system/service/impl/BaseApkFileServiceImpl.java +++ b/op-modules/op-system/src/main/java/com/op/system/service/impl/BaseApkFileServiceImpl.java @@ -1,8 +1,14 @@ package com.op.system.service.impl; +import java.util.ArrayList; +import java.util.Date; import java.util.List; + +import com.op.common.core.domain.BaseFileData; import com.op.common.core.utils.DateUtils; +import com.op.common.core.utils.StringUtils; import com.op.common.core.utils.uuid.IdUtils; +import com.op.common.security.utils.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.op.system.mapper.BaseApkFileMapper; @@ -52,6 +58,14 @@ public class BaseApkFileServiceImpl implements IBaseApkFileService { public int insertBaseApkFile(BaseApkFile baseApkFile) { baseApkFile.setId(IdUtils.fastSimpleUUID()); baseApkFile.setCreateTime(DateUtils.getNowDate()); + + //上传附件 + if (StringUtils.isNotEmpty(baseApkFile.getFileList())) { + String id = baseApkFile.getFileList().split(",")[0]; + baseApkFile.setFileName(id.split("&fileName=")[1]); + baseApkFile.setFileAddress(id); + } + return baseApkFileMapper.insertBaseApkFile(baseApkFile); } @@ -64,6 +78,12 @@ public class BaseApkFileServiceImpl implements IBaseApkFileService { @Override public int updateBaseApkFile(BaseApkFile baseApkFile) { baseApkFile.setUpdateTime(DateUtils.getNowDate()); + //上传附件 + if (StringUtils.isNotEmpty(baseApkFile.getFileList())) { + String id = baseApkFile.getFileList().split(",")[0]; + baseApkFile.setFileName(id.split("&fileName=")[1]); + baseApkFile.setFileAddress(id); + } return baseApkFileMapper.updateBaseApkFile(baseApkFile); } diff --git a/op-modules/op-system/src/main/resources/mapper/system/BaseApkFileMapper.xml b/op-modules/op-system/src/main/resources/mapper/system/BaseApkFileMapper.xml index 92612e6f..e535d49d 100644 --- a/op-modules/op-system/src/main/resources/mapper/system/BaseApkFileMapper.xml +++ b/op-modules/op-system/src/main/resources/mapper/system/BaseApkFileMapper.xml @@ -48,7 +48,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select top 1 id, file_name, file_address, version, attr1, attr2, attr3, attr4, create_by, create_time, update_by, update_time, remark from base_apk_file - order by create_by create_by desc + order by create_by desc