应收应付修改

This commit is contained in:
z 2025-07-17 18:29:31 +08:00
parent 185322296c
commit f51339f806
23 changed files with 430 additions and 76 deletions

View File

@ -58,7 +58,7 @@ public class InvoiceController {
@OperateLog(enable = false)
@Transactional(rollbackFor = Exception.class)
public CommonResult operate(@Valid @RequestBody InvoiceSaveReqVO operateReqVO) {
return success(invoiceService.operate(operateReqVO));
return invoiceService.operate(operateReqVO);
}
@DeleteMapping("/delete")

View File

@ -87,4 +87,6 @@ public class InvoiceRespVO {
@Schema(description = "订单编号")
private String orderCode;
@Schema(description = "订单编号")
private Long cgOrderIdId;
}

View File

@ -142,5 +142,10 @@ public class ProcessDesignRespVO {
private String reReason;
@Schema(description = "返工日期")
private LocalDateTime reTime;
private String blankDeferred;
private String deferred3d;
private String deferred2d;
private String blankDelayReason;
private String delayReason2d;
private String delayReason3d;
}

View File

@ -49,7 +49,7 @@ public class InvoiceDO extends BaseDO {
*
* 枚举 {@link TODO heli_invoice_type 对应的类}
*/
private String type;
private Integer type;
/**
* 开票日期
*/

View File

@ -157,4 +157,21 @@ public class ProcessDesignDO extends BaseDO {
private String reReason;
private LocalDateTime reTime;
@TableField(exist = false)
private String blankDeferred;
@TableField(exist = false)
private String deferred3d;
@TableField(exist = false)
private String deferred2d;
@TableField(exist = false)
private String blankDelayReason;
@TableField(exist = false)
private String delayReason2d;
@TableField(exist = false)
private String delayReason3d;
}

View File

@ -36,7 +36,7 @@ public interface OrderYfMapper extends BaseMapperX<OrderYfDO> {
" ELSE 2 " + // 其他情况
"END AS receivingStatus")
.leftJoin(
"finance_invoice i ON i.order_code = t.cg_order_num AND i.business_type = 'FINANCE_RECEIVE_INVOICE' AND i.status !='3'")
"finance_invoice i ON i.order_code = t.cg_order_num AND i.deleted=0 and i.tenant_id=2 and i.business_type = 'FINANCE_RECEIVE_INVOICE' AND i.status !='3'")
.leftJoin(PurchaseOrderNoDO.class,"p", PurchaseOrderNoDO::getPurchaseNo, OrderYfDO::getCgOrderNum)
.leftJoin(PurchaseOrderNoDetailDO.class,"d", PurchaseOrderNoDetailDO::getPurchaseOrderId, PurchaseOrderNoDO::getId)
.disableSubLogicDel()
@ -57,7 +57,7 @@ public interface OrderYfMapper extends BaseMapperX<OrderYfDO> {
.select("sum(i.amount) as amount")
.select("p.id as projectId","p.purchase_no as projectCode")
.leftJoin(
"finance_invoice i ON i.order_code = t.cg_order_num AND i.business_type = 'FINANCE_RECEIVE_INVOICE' AND i.status !='3'")
"finance_invoice i ON i.order_code = t.cg_order_num AND i.deleted=0 and i.tenant_id=2 and i.business_type = 'FINANCE_RECEIVE_INVOICE' AND i.status !='3'")
.leftJoin(PurchaseOrderNoDO.class,"p", PurchaseOrderNoDO::getPurchaseNo, OrderYfDO::getCgOrderNum)
.disableSubLogicDel();
query

View File

@ -33,7 +33,7 @@ public interface OrderYsMapper extends BaseMapperX<OrderYsDO> {
.select("sum(i.amount) as amount")
.select("p.delivery_status as deliveryStatus")
.leftJoin(
"finance_invoice i ON i.order_code = t.code AND i.business_type = 'FINANCE_MAKE_INVOICE' AND i.status !='3'")
"finance_invoice i ON i.order_code = t.code AND i.deleted=0 and i.tenant_id=2 and i.business_type = 'FINANCE_MAKE_INVOICE' AND i.status !='3'")
.leftJoin(ProjectOrderDO.class,"p", ProjectOrderDO::getCode, OrderYsDO::getCode)
.disableSubLogicDel()
.groupBy(OrderYsDO::getId)
@ -56,7 +56,7 @@ public interface OrderYsMapper extends BaseMapperX<OrderYsDO> {
.select("p.four_Fu_Kuan as fourFuKuan","p.five_Fu_Kuan as fiveFuKuan","p.six_Fu_Kuan as sixFuKuan")
.select("p.code as projectCode,p.id as projectId")
.leftJoin(
"finance_invoice i ON i.order_code = t.code AND i.business_type = 'FINANCE_MAKE_INVOICE' AND i.status !='3'")
"finance_invoice i ON i.order_code = t.code AND i.deleted=0 and i.tenant_id=2 and i.business_type = 'FINANCE_MAKE_INVOICE' AND i.status !='3'")
.leftJoin(ProjectOrderDO.class, "p", ProjectOrderDO::getCode, OrderYsDO::getCode)
.disableSubLogicDel();

View File

@ -1,6 +1,8 @@
package com.chanko.yunxi.mes.module.heli.service.invoice;
import javax.validation.*;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.module.heli.controller.admin.invoice.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.invoice.InvoiceDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
@ -53,7 +55,7 @@ public interface InvoiceService {
*/
PageResult<InvoiceDO> getInvoicePage(InvoicePageReqVO pageReqVO);
Long operate(InvoiceSaveReqVO operateReqVO);
CommonResult operate(InvoiceSaveReqVO operateReqVO);
List<InvoiceDO> getOrderYsInvoice(String code);

View File

@ -1,8 +1,12 @@
package com.chanko.yunxi.mes.module.heli.service.invoice;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum;
import com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.orderysdetail.OrderYsDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.orderysdetail.OrderYsDetailMapper;
import com.chanko.yunxi.mes.module.heli.enums.InvoiceStatusEnum;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@ -16,8 +20,11 @@ import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.module.heli.dal.mysql.invoice.InvoiceMapper;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*;
@ -33,6 +40,9 @@ public class InvoiceServiceImpl implements InvoiceService {
@Resource
private InvoiceMapper invoiceMapper;
@Resource
private OrderYsDetailMapper orderYsDetailMapper;
@Override
public Long createInvoice(InvoiceSaveReqVO createReqVO) {
@ -88,7 +98,7 @@ public class InvoiceServiceImpl implements InvoiceService {
@Override
@Transactional(rollbackFor = Exception.class)
public Long operate(InvoiceSaveReqVO operateReqVO) {
public CommonResult operate(InvoiceSaveReqVO operateReqVO) {
OperateTypeEnum operateTypeEnum = OperateTypeEnum.valueOf(operateReqVO.getActive());
if(operateTypeEnum == OperateTypeEnum.SUBMIT){
operateReqVO.setSubmitter(SecurityFrameworkUtils.getLoginUser().getId())
@ -97,12 +107,47 @@ public class InvoiceServiceImpl implements InvoiceService {
operateReqVO.setCanceller(SecurityFrameworkUtils.getLoginUser().getId())
.setCancelTime(LocalDateTime.now());
}
System.out.println("FINANCE_MAKE_INVOICE".equals(operateReqVO.getBusinessType()));
if ("FINANCE_MAKE_INVOICE".equals(operateReqVO.getBusinessType())){
if (ObjectUtil.isNotEmpty(operateReqVO.getCgOrderIdId())) {
OrderYsDetailDO orderYsDetailDO = orderYsDetailMapper.selectById(operateReqVO.getCgOrderIdId());
if (ObjectUtil.isNotEmpty(orderYsDetailDO)){
LambdaQueryWrapper<InvoiceDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(InvoiceDO::getCgOrderIdId, operateReqVO.getCgOrderIdId());
if (ObjectUtil.isNotEmpty(operateReqVO.getId())) {
wrapper.ne(InvoiceDO::getId, operateReqVO.getId());
List<InvoiceDO> invoiceDOS = invoiceMapper.selectList(wrapper);
BigDecimal sum = invoiceDOS.stream()
.filter(Objects::nonNull) // 过滤掉空对象
.map(InvoiceDO::getAmount)
.filter(Objects::nonNull) // 过滤掉空值
.reduce(BigDecimal.ZERO, BigDecimal::add); // 累加求和
if (sum.add(operateReqVO.getAmount()).compareTo(orderYsDetailDO.getCgYishou())>0){
return CommonResult.error(400,"已开发票"+sum.setScale(2, RoundingMode.HALF_UP)+"+本次开票"+operateReqVO.getAmount().setScale(2, RoundingMode.HALF_UP)+">回款金额"+orderYsDetailDO.getCgYishou().setScale(2, RoundingMode.HALF_UP)+"请确认!");
}
} else {
List<InvoiceDO> invoiceDOS = invoiceMapper.selectList(wrapper);
BigDecimal sum=BigDecimal.ZERO;
if (ObjectUtil.isNotEmpty(invoiceDOS)){
sum = invoiceDOS.stream()
.filter(Objects::nonNull) // 过滤掉空对象
.map(InvoiceDO::getAmount)
.filter(Objects::nonNull) // 过滤掉空值
.reduce(BigDecimal.ZERO, BigDecimal::add); // 累加求和
}
if (sum.add(operateReqVO.getAmount()).compareTo(orderYsDetailDO.getCgYishou())>0){
return CommonResult.error(400,"已开发票"+sum+"+本次开票"+operateReqVO.getAmount()+">回款金额"+orderYsDetailDO.getCgYishou().setScale(2, RoundingMode.HALF_UP)+"请确认!");
}
}
}
}
}
if(operateReqVO.getId() == null){
operateReqVO.setId(createInvoice(operateReqVO));
}else{
updateInvoice(operateReqVO);
}
return operateReqVO.getId();
return CommonResult.success(operateReqVO.getId());
}
@Override

View File

@ -1,7 +1,10 @@
package com.chanko.yunxi.mes.module.heli.service.orderyfdetail;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.orderyf.OrderYfDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.orderys.OrderYsDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.orderysdetail.OrderYsDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.orderyf.OrderYfMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -30,6 +33,8 @@ public class OrderYfDetailServiceImpl implements OrderYfDetailService {
@Resource
private OrderYfDetailMapper orderYfDetailMapper;
@Resource
private OrderYfMapper orderYfMapper;
@Override
public Integer createOrderYfDetail(OrderYfDetailSaveReqVO createReqVO) {
@ -53,6 +58,10 @@ public class OrderYfDetailServiceImpl implements OrderYfDetailService {
public void deleteOrderYfDetail(Integer id) {
// 校验存在
validateOrderYfDetailExists(id);
OrderYfDetailDO orderYfDetailDO = orderYfDetailMapper.selectById(id);
OrderYfDO orderYfDO = orderYfMapper.selectById(orderYfDetailDO.getCgId());
orderYfDO.setCgYifu(orderYfDO.getCgYifu().subtract(orderYfDetailDO.getCgYifu()));
orderYfMapper.updateById(orderYfDO);
// 删除
orderYfDetailMapper.deleteById(id);
}

View File

@ -1,6 +1,8 @@
package com.chanko.yunxi.mes.module.heli.service.orderysdetail;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.orderys.OrderYsDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.orderys.OrderYsMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -29,6 +31,8 @@ public class OrderYsDetailServiceImpl implements OrderYsDetailService {
@Resource
private OrderYsDetailMapper orderYsDetailMapper;
@Resource
private OrderYsMapper orderYsMapper;
@Override
public Integer createOrderYsDetail(OrderYsDetailSaveReqVO createReqVO) {
@ -52,6 +56,10 @@ public class OrderYsDetailServiceImpl implements OrderYsDetailService {
public void deleteOrderYsDetail(Integer id) {
// 校验存在
validateOrderYsDetailExists(id);
OrderYsDetailDO orderYsDetailDO = orderYsDetailMapper.selectById(id);
OrderYsDO orderYsDO = orderYsMapper.selectById(orderYsDetailDO.getCgId());
orderYsDO.setCgYishou(orderYsDO.getCgYishou().subtract(orderYsDetailDO.getCgYishou()));
orderYsMapper.updateById(orderYsDO);
// 删除
orderYsDetailMapper.deleteById(id);
}

View File

@ -26,6 +26,7 @@ import com.chanko.yunxi.mes.module.heli.dal.mysql.processdesign.ProcessDesignPro
import com.chanko.yunxi.mes.module.heli.enums.ProcessDesignTypeEnum;
import com.chanko.yunxi.mes.module.heli.enums.WarningEnum;
import com.chanko.yunxi.mes.module.heli.vo.WarningMessageVO;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.security.access.method.P;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -34,7 +35,9 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
@ -271,6 +274,7 @@ public class ProcessDesignServiceImpl implements ProcessDesignService {
if(ProcessDesignTypeEnum.BLUEPRINT_WORKBLANK.name().equals(processDesign.getProcessDesignType())){
processDesignDO.setBlankDate(processDesign.getBlankDate())
.setStartBlankDate(processDesign.getStartBlankDate())
.setBlankDelayReason(processDesign.getDelayReason())
.setBlankOwnerName(processDesign.getBlankOwnerName());
LambdaQueryWrapper<ProcessDesignProgressDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ProcessDesignProgressDO::getProcessDesignId, processDesign.getId());
@ -284,9 +288,39 @@ public class ProcessDesignServiceImpl implements ProcessDesignService {
processDesignDO.setProgressBlank("进行中");
}
}
if (ObjectUtil.isNotEmpty(processDesign.getBlankDate())){
if (processDesign.getIsOverProcess()==1){
LambdaQueryWrapper<ProcessDesignProgressDO> wrapper1 = new LambdaQueryWrapper<>();
wrapper1.eq(ProcessDesignProgressDO::getProcessDesignId, processDesign.getId());
wrapper1.orderByDesc(ProcessDesignProgressDO::getEndTime);
wrapper1.last("limit 1");
ProcessDesignProgressDO processDesignProgressDO1 = processDesignProgressMapper.selectOne(wrapper1);
if (compareDateParts(processDesignProgressDO1.getEndTime().toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime(),processDesign.getBlankDate())>0){
processDesignDO.setBlankDeferred("");
}else {
processDesignDO.setBlankDeferred("");
}
}else{
if (compareDateParts(LocalDateTime.now(),processDesign.getBlankDate())>0){
processDesignDO.setBlankDeferred("");
}else {
processDesignDO.setBlankDeferred("");
}
}
}else {
processDesignDO.setBlankDeferred("");
}
}else if(ProcessDesignTypeEnum.BLUEPRINT_3D.name().equals(processDesign.getProcessDesignType())){
processDesignDO.setThreeDimDate(processDesign.getThreeDimDate())
.setStartThreeDimDate(processDesign.getStartThreeDimDate())
.setDelayReason3d(processDesign.getDelayReason())
.setThreeDimOwnerName(processDesign.getThreeDimOwnerName());
LambdaQueryWrapper<ProcessDesignProgressDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ProcessDesignProgressDO::getProcessDesignId, processDesign.getId());
@ -301,9 +335,37 @@ public class ProcessDesignServiceImpl implements ProcessDesignService {
processDesignDO.setProgress3d("进行中");
}
}
if (ObjectUtil.isNotEmpty(processDesign.getThreeDimDate())){
if (processDesign.getIsOverProcess()==1){
LambdaQueryWrapper<ProcessDesignProgressDO> wrapper1 = new LambdaQueryWrapper<>();
wrapper1.eq(ProcessDesignProgressDO::getProcessDesignId, processDesign.getId());
wrapper1.orderByDesc(ProcessDesignProgressDO::getEndTime);
wrapper1.last("limit 1");
ProcessDesignProgressDO processDesignProgressDO1 = processDesignProgressMapper.selectOne(wrapper1);
if (compareDateParts(processDesignProgressDO1.getEndTime().toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime(),processDesign.getThreeDimDate())>0){
processDesignDO.setDeferred3d("");
}else {
processDesignDO.setDeferred3d("");
}
}else{
if (compareDateParts(LocalDateTime.now(),processDesign.getThreeDimDate())>0){
processDesignDO.setDeferred3d("");
}else {
processDesignDO.setDeferred3d("");
}
}
}else {
processDesignDO.setDeferred3d("");
}
}else if(ProcessDesignTypeEnum.BLUEPRINT_2D.name().equals(processDesign.getProcessDesignType())){
processDesignDO.setTwoDimDate(processDesign.getTwoDimDate())
.setStartTwoDimDate(processDesign.getStartTwoDimDate())
.setDelayReason2d(processDesign.getDelayReason())
.setTwoDimOwnerName(processDesign.getTwoDimOwnerName());
LambdaQueryWrapper<ProcessDesignProgressDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ProcessDesignProgressDO::getProcessDesignId, processDesign.getId());
@ -317,6 +379,31 @@ public class ProcessDesignServiceImpl implements ProcessDesignService {
processDesignDO.setProgress2d("进行中");
}
}
if (ObjectUtil.isNotEmpty(processDesign.getTwoDimDate())){
if (processDesign.getIsOverProcess()==1){
LambdaQueryWrapper<ProcessDesignProgressDO> wrapper1 = new LambdaQueryWrapper<>();
wrapper1.eq(ProcessDesignProgressDO::getProcessDesignId, processDesign.getId());
wrapper1.orderByDesc(ProcessDesignProgressDO::getEndTime);
wrapper1.last("limit 1");
ProcessDesignProgressDO processDesignProgressDO1 = processDesignProgressMapper.selectOne(wrapper1);
if (compareDateParts(processDesignProgressDO1.getEndTime().toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime(),processDesign.getTwoDimDate())>0){
processDesignDO.setDeferred2d("");
}else {
processDesignDO.setDeferred2d("");
}
}else{
if (compareDateParts(LocalDateTime.now(),processDesign.getTwoDimDate())>0){
processDesignDO.setDeferred2d("");
}else {
processDesignDO.setDeferred2d("");
}
}
}else {
processDesignDO.setDeferred2d("");
}
}
});
}
@ -338,6 +425,14 @@ public class ProcessDesignServiceImpl implements ProcessDesignService {
}
return processDesignDOPageResult;
}
public int compareDateParts(LocalDateTime dt1, LocalDateTime dt2) {
// 提取日期部分
LocalDate date1 = dt1.toLocalDate();
LocalDate date2 = dt2.toLocalDate();
// 使用compareTo比较
return date1.compareTo(date2);
}
// ==================== 子表工艺设计进度 ====================

View File

@ -24,10 +24,11 @@
</select>
<select id="StandardPartsCost" resultType="java.math.BigDecimal">
SELECT ROUND(sum(o.estimated_price*ROUND( bd.amount/ o.purchase_amount, 2)),2) cost
SELECT ROUND(sum(o.estimated_price * ROUND((bd.amount*d.amount) / o.purchase_amount, 2)), 2) cost
FROM pro_process_bom bom
left join pro_process_bom_detail bd on bd.bom_id=bom.id and bd.deleted=0 and bd.tenant_id=2
left join project_purchase_order_no_detail o on o.boom_detail_id=bd.id and o.deleted=0 and o.tenant_id=2
left join project_sale_order_sub d on d.id=bom.project_sub_id and d.deleted = 0 AND d.tenant_id = 2
where bom.deleted=0 and bd.type=1 and bom.project_id=#{id} and bom.project_sub_id=#{projectSubId}
</select>

View File

@ -16,6 +16,7 @@ export interface InvoiceVO {
canceller: number
cancelTime: Date
status: number
cgOrderIdId:number
}
// 查询财务发票分页

View File

@ -106,7 +106,7 @@
删除
</el-button>
<el-button link type="primary" size="small" @click.prevent="invoices(scope.row.id)" >
</el-button>
</template>
</el-table-column>
@ -118,7 +118,7 @@
</el-card>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button @click="cancel"> </el-button>
</template>
</Dialog>
<Invoivce ref="formRefs" @success="getList" />
@ -129,6 +129,7 @@ import * as OrderYfApi from '@/api/heli/orderyf'
import * as OrderYfDetailApi from '@/api/heli/orderyfdetail'
import {DICT_TYPE, getIntDictOptions, getStrDictOptions} from "@/utils/dict";
import Invoivce from "@/views/heli/orderyf/invoivce.vue";
import * as InvoiceApi from "@/api/heli/invoice";
const { t } = useI18n() //
const message = useMessage() //
@ -230,15 +231,32 @@ const onAddItem = () => {
formData.value.orderYfDetails.push(row)
}
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
id:undefined,
type:undefined,
})
/** 删除子项操作 */
const onDeleteItem = async (index) => {
if (index!=formData.value.orderYfDetails.length-1){
message.error(`请从最后一条数据开始删除`)
return false
}
let deletedItems = formData.value.orderYfDetails.splice(index, 1)
let id = deletedItems[0].id;
if (id) await OrderYfDetailApi.deleteOrderYfDetail(id)
let id = formData.value.orderYfDetails[index].id;
if (id){
queryParams.id=id
queryParams.type="FINANCE_RECEIVE_INVOICE"
const data=await InvoiceApi.getInvoicePages(queryParams)
if (data.total>0){
message.error(`该付款发票已接收,不允许删除`)
return false
}
await OrderYfDetailApi.deleteOrderYfDetail(id)
}
formData.value.orderYfDetails.splice(index, 1)
formData.value.cgYifu=formData.value.orderYfDetails.reduce((sum, item) => sum + Number(item.cgYifu), 0);
}
const sum = async () => {
@ -246,6 +264,11 @@ const sum = async () => {
}
/** 提交表单 */
const emit = defineEmits(['success']) // success
const cancel = async () => {
dialogVisible.value = false
emit('success')
}
const submitForm = async () => {
//
// await formRef.value.validate()

View File

@ -100,7 +100,7 @@
width="180px"
v-if="false"
/>
<el-table-column label="采购订单编号" align="center" prop="cgOrderNum" />
<el-table-column label="采购订单编号" align="center" prop="cgOrderNum" width="180"/>
<!-- <el-table-column-->
<!-- label="生成日期"-->
<!-- align="center"-->

View File

@ -134,7 +134,11 @@
width="140"
/>
<el-table-column label="发票金额" align="center" prop="amount" />
<el-table-column label="发票类型" align="center" prop="type" />
<el-table-column label="发票类型" align="center" prop="type" >
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_INVOICE_TYPE" :value="scope.row.type" />
</template>
</el-table-column>
<el-table-column label="税率(%)" align="center" prop="rate" />
<el-table-column label="订单" align="center" prop="orderCode" />
<el-table-column label="备注" align="center" prop="remark" />
@ -267,6 +271,7 @@ const resetForm = () => {
// formRef.value?.resetFields()
}
const flag = ref(true)
const getList = async (id) => {
queryParams.id=id
queryParams.type="FINANCE_RECEIVE_INVOICE"
@ -275,6 +280,8 @@ const getList = async (id) => {
const data=await InvoiceApi.getInvoicePages(queryParams)
list.value = data.list
total.value = data.total
flag.value=true
uploadFiles.value=[]
} finally {
loading1.value = false
}
@ -282,7 +289,6 @@ const getList = async (id) => {
const emits = async () => {
dialogVisible.value = false
emit('success')
}
const queryData = async (id?: number) => {
resetForm()
@ -321,6 +327,7 @@ const submitForm = async () => {
//
if (uploadFiles.value.length > 0) {
flag.value=false
uploadData.value.businessId = dataId
await uploadRef.value!.submit()
message.success(t('common.operationSuccess'))
@ -329,6 +336,7 @@ const submitForm = async () => {
commonStore.setStore('active', jumpActive)
commonStore.setStore('businessType', "FINANCE_RECEIVE_INVOICE")
resetForm();
uploadFiles.value=[]
getList(detailId.value)
}else{
message.success(t('common.operationSuccess'))
@ -368,7 +376,7 @@ const handleAvatarSuccess: UploadProps['onSuccess'] = async (
businessFileType:"FINANCE_RECEIVE_INVOICE"
}
uploading.value = true;
formData.value.attachments = (await getFilePage(attParams)).list
// formData.value.attachments = (await getFilePage(attParams)).list
// await reload()
uploading.value = false;
@ -385,8 +393,6 @@ const uploadChange = (file, files) => {
uploadFiles.value = files
refreshAttachments(files)
}
const open = async (id?: number,projectId,projectCode) => {
resetForm()
dialogVisible.value = true
@ -396,6 +402,7 @@ const open = async (id?: number,projectId,projectCode) => {
formData.value.orderId = projectId
formData.value.orderCode = projectCode
formData.value.cgOrderIdId=id
uploadFiles.value=[]
getList(id)
}
@ -416,10 +423,10 @@ const handleDelete = async (id: number) => {
defineExpose({ open }) // open
const refreshAttachments = (files) => {
if (flag.value){
formData.value.attachments = formData.value.attachments.filter((value, index, array) => {
return value.id
})
for (let i = 0; i < files.length; i++) {
let file = files[i]
file.createTime = new Date()
@ -428,6 +435,7 @@ const refreshAttachments = (files) => {
//
formData.value.attachments.sort((v1, v2) => v1.createTime - v2.createTime)
}
}
//
const handleDeleteAttachment = async (index) => {

View File

@ -71,7 +71,7 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" @row-click="rowClick" highlight-current-row>
<el-table-column label="采购订单编号" align="center" prop="cgOrderNum"/>
<el-table-column label="采购订单编号" align="center" prop="cgOrderNum" width="180px"/>
<el-table-column label="供应商名称" align="center" prop="cgGysname" />
<!-- <el-table-column-->
@ -83,12 +83,35 @@
<!-- />-->
<el-table-column label="应付金额(元)" align="center" prop="cgYf" />
<el-table-column label="已付金额(元)" align="center" prop="cgYifu" />
<el-table-column label="已付款比例" align="center" >
<template #default="scope">
{{
scope.row.cgYifu&&scope.row.cgYf
? (Number(scope.row.cgYifu) * 100 / Number(scope.row.cgYf)).toFixed(0)
: '0'
}}%
</template>
</el-table-column>
<el-table-column label="已开票金额(元)" align="center" prop="amount" />
<el-table-column label="已开票比例" align="center" >
<template #default="scope">
{{
scope.row.cgYf&&scope.row.cgYf
? (Number(scope.row.amount) * 100 / Number(scope.row.cgYf)).toFixed(0)
: '0'
}}%
</template>
</el-table-column>
<el-table-column label="付款状态" align="center" prop="cgTypee" >
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_YINGFU_MONEY" :value="scope.row.cgTypee" />
</template>
</el-table-column>
<el-table-column label="订单状态" align="center" prop="receivingStatus" min-width="150">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PURCHASE_RECEIVING_STATUS" :value="scope.row.receivingStatus" />
</template>
</el-table-column>
<!-- <el-table-column label="项目编号" align="center" prop="code" width="180"/>-->
<el-table-column label="备注" align="center" prop="rem" />
<!-- <el-table-column label="操作" align="center" width="180">-->

View File

@ -186,7 +186,7 @@
</el-card>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button @click="cancel"> </el-button>
</template>
</Dialog>
<Invoivce ref="formRefs" @success="getList" />
@ -198,12 +198,18 @@ import * as OrderYsDetailApi from '@/api/heli/orderysdetail'
import {DICT_TYPE, getIntDictOptions, getStrDictOptions} from "@/utils/dict";
import Invoivce from "@/views/heli/orderys/invoivce.vue";
import {ref} from "vue";
import * as InvoiceApi from "@/api/heli/invoice";
const { t } = useI18n() //
const message = useMessage() //
const formRefs = ref()
const ids = ref()
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
id:undefined,
type:undefined,
})
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
@ -294,9 +300,18 @@ const onDeleteItem = async (index) => {
message.error(`请从最后一条数据开始删除`)
return false
}
let deletedItems = formData.value.orderYsDetails.splice(index, 1)
let id = deletedItems[0].id;
if (id) await OrderYsDetailApi.deleteOrderYsDetail(id)
let id = formData.value.orderYsDetails[index].id;
if (id){
queryParams.id=id
queryParams.type="FINANCE_MAKE_INVOICE"
const data=await InvoiceApi.getInvoicePages(queryParams)
if (data.total>0){
message.error(`该回款已开票,不允许删除`)
return false
}
await OrderYsDetailApi.deleteOrderYsDetail(id)
}
formData.value.orderYsDetails.splice(index, 1)
formData.value.cgYishou=formData.value.orderYsDetails.reduce((sum, item) => sum + Number(item.cgYishou), 0);
}
@ -326,6 +341,11 @@ const sum = async () => {
}
/** 提交表单 */
const emit = defineEmits(['success']) // success
const cancel = async () => {
dialogVisible.value = false
emit('success')
}
const submitForm = async () => {
//
// await formRef.value.validate()
@ -343,6 +363,35 @@ const submitForm = async () => {
message.error('第'+(i+1)+'行回款金额不能为空')
return false
}
if (formData.value.orderYsDetails[i].cgType==1&&formData.value.shouFuKuan==null){
message.error('付款类型跟订单不一致,不允许添加')
return false
}
if (formData.value.orderYsDetails[i].cgType==2&&formData.value.twoFuKuan==null){
message.error('付款类型跟订单不一致,不允许添加')
return false
}
if (formData.value.orderYsDetails[i].cgType==3&&formData.value.threeFuKuan==null){
message.error('付款类型跟订单不一致,不允许添加')
return false
}
if (formData.value.orderYsDetails[i].cgType==4&&formData.value.fourFuKuan==null){
message.error('付款类型跟订单不一致,不允许添加')
return false
}
if (formData.value.orderYsDetails[i].cgType==5&&formData.value.fiveFuKuan==null){
message.error('付款类型跟订单不一致,不允许添加')
return false
}
if (formData.value.orderYsDetails[i].cgType==6&&formData.value.sixFuKuan==null){
message.error('付款类型跟订单不一致,不允许添加')
return false
}
}
if (formData.value.cgYishou>=formData.value.cgYs){
message.error('已收金额大于应收金额,请确认')
return false
}
if (formData.value.cgYishou!=''&&formData.value.cgYishou!=undefined&&formData.value.cgYishou!=null){
if (formData.value.cgYishou<formData.value.cgYs&&formData.value.cgTypee==1){

View File

@ -86,7 +86,7 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="项目名称" align="center" prop="projectName" />
<el-table-column label="项目名称" align="center" prop="projectName" width="180"/>
<!-- <el-table-column-->
<!-- label="生成日期"-->
<!-- align="center"-->

View File

@ -134,7 +134,11 @@
width="140"
/>
<el-table-column label="发票金额" align="center" prop="amount" />
<el-table-column label="发票类型" align="center" prop="type" />
<el-table-column label="发票类型" align="center" prop="type" >
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_INVOICE_TYPE" :value="scope.row.type" />
</template>
</el-table-column>
<el-table-column label="税率(%)" align="center" prop="rate" />
<el-table-column label="订单" align="center" prop="orderCode" />
<el-table-column label="备注" align="center" prop="remark" />
@ -199,6 +203,8 @@ const currentId = toRef(commonStore.getStore('id'))
const businessType = toRef(commonStore.getStore('businessType'))
const formLoading = ref(false)
const flag = ref(true)
const dialogTitle = ref('')
const detailDisabled = ref(false)
const queryParams = reactive({
@ -276,6 +282,7 @@ const getList = async (id) => {
const data=await InvoiceApi.getInvoicePages(queryParams)
list.value = data.list
total.value = data.total
flag.value=true
} finally {
loading1.value = false
}
@ -317,11 +324,13 @@ const submitForm = async () => {
//
formLoading.value = true
try {
console.log(formData.value)
const data = formData.value as unknown as InvoiceApi.InvoiceVO
let dataId = await InvoiceApi.operateInvoice(data)
//
if (uploadFiles.value.length > 0) {
flag.value=false
uploadData.value.businessId = dataId
await uploadRef.value!.submit()
message.success(t('common.operationSuccess'))
@ -329,6 +338,7 @@ const submitForm = async () => {
commonStore.setStore('id', dataId)
commonStore.setStore('active', jumpActive)
commonStore.setStore('businessType', "FINANCE_MAKE_INVOICE")
uploadFiles.value=[]
resetForm();
getList(detailId.value)
}else{
@ -364,13 +374,16 @@ const handleAvatarSuccess: UploadProps['onSuccess'] = async (
let attParams = {
pageNo: 1,
pageSize: 99,
businessId: currentId.value,
businessId: null,
businessType: "FINANCE_MAKE_INVOICE",
businessFileType:"FINANCE_MAKE_INVOICE"
}
uploading.value = true;
formData.value.attachments = (await getFilePage(attParams)).list
// formData.value.attachments = (await getFilePage(attParams)).list
// await reload()
// formData.value.attachments=[]
console.log(111)
console.log(formData.value.attachments)
uploading.value = false;
}
@ -397,6 +410,7 @@ const open = async (id?: number,projectId,projectCode) => {
formData.value.orderId = projectId
formData.value.orderCode = projectCode
formData.value.cgOrderIdId=id
uploadFiles.value=[]
getList(id)
}
@ -417,10 +431,10 @@ const handleDelete = async (id: number) => {
defineExpose({ open }) // open
const refreshAttachments = (files) => {
if (flag.value){
formData.value.attachments = formData.value.attachments.filter((value, index, array) => {
return value.id
})
for (let i = 0; i < files.length; i++) {
let file = files[i]
file.createTime = new Date()
@ -429,6 +443,7 @@ const refreshAttachments = (files) => {
//
formData.value.attachments.sort((v1, v2) => v1.createTime - v2.createTime)
}
}
//
const handleDeleteAttachment = async (index) => {

View File

@ -104,12 +104,35 @@
/>
<el-table-column label="应收金额(元)" align="center" prop="cgYs" />
<el-table-column label="已收金额(元)" align="center" prop="cgYishou" />
<el-table-column label="已收款比例" align="center" >
<template #default="scope">
{{
scope.row.cgYishou&&scope.row.cgYs
? (Number(scope.row.cgYishou) * 100 / Number(scope.row.cgYs)).toFixed(0)
: '0'
}}%
</template>
</el-table-column>
<el-table-column label="已开票金额(元)" align="center" prop="amount" />
<el-table-column label="已开票比例" align="center" >
<template #default="scope">
{{
scope.row.cgYs&&scope.row.cgYs
? (Number(scope.row.amount) * 100 / Number(scope.row.cgYs)).toFixed(0)
: '0'
}}%
</template>
</el-table-column>
<el-table-column label="回款状态" align="center" prop="cgTypee" >
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_YINGFU_MONEY" :value="scope.row.cgTypee" />
</template>
</el-table-column>
<el-table-column label="订单状态" align="center" prop="deliveryStatus" width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_DELIVERY_STATUS" :value="scope.row.deliveryStatus" />
</template>
</el-table-column>
<!-- <el-table-column label="项目编号" align="center" prop="code" width="180"/>-->
<el-table-column label="备注" align="center" prop="rem"/>
<!-- <el-table-column label="操作" align="center" width="180">-->

View File

@ -87,44 +87,62 @@
<el-table-column fixed label="项目名称" align="center" prop="projectName" min-width="180" />
<el-table-column fixed label="子项目名称" align="center" prop="projectSubName" min-width="180" />
<el-table-column label="毛坯负责人" align="center" prop="blankOwnerName" width="120"/>
<el-table-column label="毛坯最新进度" align="center" prop="progressBlank" min-width="140" />
<!-- <template #default="scope">-->
<!-- {{!scope.row.progressBlank ? '' : (parseFloat(scope.row.progressBlank) + '%')}}-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="毛坯最新进度" align="center" prop="progressBlank" min-width="140" >
<!-- 使用 scoped slots 自定义单元格渲染 -->
<template #default="{ row }">
<div
:style="getCellStyle(row.progressBlank)"
>
{{ row.progressBlank }}
</div>
</template>
</el-table-column>
<el-table-column label="毛坯计划截止日期" align="center" prop="blankDate" :formatter="dateFormatter2" min-width="180"/>
<el-table-column label="毛坯是否延期" align="center" prop="blankDeferred" min-width="140">
<template #default="scope">
<span v-if="scope.row.blankDate && (new Date().getTime() - 86400000 - new Date(formatDate(scope.row.blankDate, 'YYYY-MM-DD')).getTime() >= 0 && (!scope.row.progressBlank || parseFloat(scope.row.progressBlank) < 100))" style="color: red;"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column label="毛坯是否延期" align="center" prop="blankDeferred" min-width="140"/>
<el-table-column label="延期备注" align="center" prop="blankDelayReason" min-width="140"/>
<!-- <template #default="scope">-->
<!-- <span v-if="scope.row.blankDate && (new Date().getTime() - 86400000 - new Date(formatDate(scope.row.blankDate, 'YYYY-MM-DD')).getTime() >= 0 && (!scope.row.progressBlank || parseFloat(scope.row.progressBlank) < 100))" style="color: red;"></span>-->
<!-- <span v-else></span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="3D负责人" align="center" prop="threeDimOwnerName" min-width="120"/>
<el-table-column label="3D最新进度" align="center" prop="progress3d" min-width="140" />
<!-- <template #default="scope">-->
<!-- {{!scope.row.progress3d ? '' : (parseFloat(scope.row.progress3d) + '%')}}-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="3D最新进度" align="center" prop="progress3d" min-width="140" >
<!-- 使用 scoped slots 自定义单元格渲染 -->
<template #default="{ row }">
<div
:style="getCellStyle(row.progress3d)"
>
{{ row.progress3d }}
</div>
</template>
</el-table-column>
<el-table-column label="3D计划截止日期" align="center" prop="threeDimDate" :formatter="dateFormatter2" width="180"/>
<el-table-column label="3D是否延期" align="center" prop="3dDeferred" min-width="140">
<template #default="scope">
<span v-if="scope.row.threeDimDate && (new Date().getTime() - 86400000 - new Date(formatDate(scope.row.threeDimDate, 'YYYY-MM-DD')).getTime() >= 0 && (!scope.row.progress3d || parseFloat(scope.row.progress3d) < 100))" style="color: red;"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column label="2D负责人" align="center" prop="twoDimOwnerName" min-width="120"/>
<el-table-column label="2D最新进度" align="center" prop="progress2d" min-width="140"/> >
<el-table-column label="3D是否延期" align="center" prop="deferred3d" min-width="140"/>
<el-table-column label="延期备注" align="center" prop="delayReason3d" min-width="140"/>
<!-- <template #default="scope">-->
<!-- {{!scope.row.progress2d ? '' : (parseFloat(scope.row.progress2d) + '%')}}-->
<!-- <span v-if="scope.row.threeDimDate && (new Date().getTime() - 86400000 - new Date(formatDate(scope.row.threeDimDate, 'YYYY-MM-DD')).getTime() >= 0 && (!scope.row.progress3d || parseFloat(scope.row.progress3d) < 100))" style="color: red;"></span>-->
<!-- <span v-else></span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="2D计划截止日期" align="center" prop="twoDimDate" :formatter="dateFormatter2" min-width="180"/>
<el-table-column label="2D是否延期" align="center" prop="2dDeferred" min-width="140">
<template #default="scope">
<span v-if="scope.row.twoDimDate && (new Date().getTime() - 86400000 - new Date(formatDate(scope.row.twoDimDate, 'YYYY-MM-DD')).getTime() >= 0 && (!scope.row.progress2d || parseFloat(scope.row.progress2d) < 100))" style="color: red;"></span>
<span v-else></span>
<el-table-column label="2D负责人" align="center" prop="twoDimOwnerName" min-width="120"/>
<el-table-column label="2D最新进度" align="center" prop="progress2d" min-width="140">
<!-- 使用 scoped slots 自定义单元格渲染 -->
<template #default="{ row }">
<div
:style="getCellStyle(row.progress2d)"
>
{{ row.progress2d }}
</div>
</template>
</el-table-column>
<el-table-column label="2D计划截止日期" align="center" prop="twoDimDate" :formatter="dateFormatter2" min-width="180"/>
<el-table-column label="2D是否延期" align="center" prop="deferred2d" min-width="140"/>
<el-table-column label="延期备注" align="center" prop="delayReason2d" min-width="140"/>
<!-- <template #default="scope">-->
<!-- <span v-if="scope.row.twoDimDate && (new Date().getTime() - 86400000 - new Date(formatDate(scope.row.twoDimDate, 'YYYY-MM-DD')).getTime() >= 0 && (!scope.row.progress2d || parseFloat(scope.row.progress2d) < 100))" style="color: red;"></span>-->
<!-- <span v-else></span>-->
<!-- </template>-->
<!-- </el-table-column>-->
</el-table>
<!-- 分页 -->
<Pagination
@ -229,7 +247,17 @@ const handleExport = async () => {
exportLoading.value = false
}
}
//
const getCellStyle = (status) => {
switch (status) {
case '已完成':
return { backgroundColor: '#f2f2f2' } //
case '进行中':
return { backgroundColor: '#90EE90' } // 绿
default:
return {} //
}
}
/** 初始化 **/
onMounted(() => {
getList()