spring
9 小时以前 4ec5774fa25119744bf534266d6a09df33cb8fc6
Merge branch 'dev_New' of http://114.132.189.42:9002/r/product-inventory-management into dev_New
已修改7个文件
216 ■■■■ 文件已修改
src/api/productionManagement/productionCosting.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/PIMTable/PIMTable.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/financialManagement/expenseManagement/index.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/financialManagement/loanManagement/index.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/financialManagement/revenueManagement/index.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/productionCosting/index.vue 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/salesLedger/index.vue 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/productionManagement/productionCosting.js
@@ -8,4 +8,24 @@
    method: "get",
    params: query,
  });
}
}
// 左边表格的接口
// salesLedger/productionAccounting/page
export function salesLedgerProductionAccountingList(query) {
  return request({
    url: "/salesLedger/productionAccounting/page",
    method: "get",
    params: query,
  });
}
// 右边表格的接口
//
export function salesLedgerProductionAccountingListProductionDetails(query) {
  return request({
    url: "/salesLedger/productionAccounting/listProductionDetails",
    method: "get",
    params: query,
  });
}
src/components/PIMTable/PIMTable.vue
@@ -233,7 +233,7 @@
const uploadHeader = proxy.uploadHeader;
const javaApi = proxy.javaApi;
const emit = defineEmits(["pagination", "expand-change", "selection-change"]);
const emit = defineEmits(["pagination", "expand-change", "selection-change", "row-click"]);
// Filters
const typeFn = (val, row) => {
@@ -427,6 +427,10 @@
  emit("pagination", { page: page, limit: limit });
};
const rowClick = (row) => {
  emit("row-click", row);
};
const expandChange = (row, expandedRows) => {
  emit("expand-change", row, expandedRows);
};
src/views/financialManagement/expenseManagement/index.vue
@@ -51,6 +51,8 @@
          size: pagination.pageSize,
          total: pagination.total,
        }"
        :isShowSummary="true"
        :summaryMethod="summarizeMainTable"
        @selection-change="handleSelectionChange"
        @pagination="changePage"
      >
@@ -202,6 +204,11 @@
  ]
);
// 表格合计:支出金额
const summarizeMainTable = (param) => {
  return proxy.summarizeTable(param, ["expenseMoney"]);
};
// 多选后做什么
const handleSelectionChange = (selectionList) => {
  multipleList.value = selectionList;
src/views/financialManagement/loanManagement/index.vue
@@ -64,6 +64,8 @@
          size: pagination.pageSize,
          total: pagination.total,
        }"
        :isShowSummary="true"
        :summaryMethod="summarizeMainTable"
        @selection-change="handleSelectionChange"
        @pagination="changePage"
      >
@@ -191,6 +193,11 @@
  }
);
// 表格合计:借款金额
const summarizeMainTable = (param) => {
  return proxy.summarizeTable(param, ["borrowAmount"]);
};
// 多选后做什么
const handleSelectionChange = (selectionList) => {
  multipleList.value = selectionList;
src/views/financialManagement/revenueManagement/index.vue
@@ -51,6 +51,8 @@
          size: pagination.pageSize,
          total: pagination.total,
        }"
        :isShowSummary="true"
        :summaryMethod="summarizeMainTable"
        @selection-change="handleSelectionChange"
        @pagination="changePage"
      >
@@ -202,6 +204,11 @@
  ]
);
// 表格合计:收入金额
const summarizeMainTable = (param) => {
  return proxy.summarizeTable(param, ["incomeMoney"]);
};
// 多选后做什么
const handleSelectionChange = (selectionList) => {
  multipleList.value = selectionList;
src/views/productionManagement/productionCosting/index.vue
@@ -16,8 +16,11 @@
                    :column="leftTableColumn"
                    :tableData="leftTableData"
                    :tableLoading="tableLoading"
                    @rowClick="handleLeftRowClick"
                ></PIMTable>
          :page="page"
          :height="200"
          @row-click="handleLeftRowClick"
          @pagination="pagination"
        ></PIMTable>
            </div>
            <!-- 右侧明细(原有内容) -->
@@ -29,10 +32,10 @@
                        rowKey="id"
                        :column="tableColumn"
                        :tableData="tableData"
                        :page="page"
                        :page="page1"
                        :tableLoading="tableLoading"
                        style="margin-right: 20px;"
                        @pagination="pagination"
                        @pagination="pagination1"
                    ></PIMTable>
            </div>
        </div>
@@ -41,77 +44,66 @@
<script setup>
import {onMounted, ref} from "vue";
import {
    listCustomer,
} from "@/api/basicData/customerFile.js";
import { ElMessageBox } from "element-plus";
import dayjs from "dayjs";
import {productionAccountingListPage} from "@/api/productionManagement/productionCosting.js";
import {salesLedgerProductionAccountingListProductionDetails, salesLedgerProductionAccountingList} from "@/api/productionManagement/productionCosting.js";
const { proxy } = getCurrentInstance();
const tableColumn = ref([
    {
        label: "生产日期",
        prop: "schedulingDate",
        width: 120,
        prop: "scheduleDate",
    minWidth: 100,
    },
    {
        label: "生产人",
        prop: "schedulingUserName",
        width: 90,
    minWidth: 100,
    },
    {
        label: "合同号",
        prop: "salesContractNo",
        width: 220,
    minWidth: 100,
    },
    // {
    //     label: "客户合同号",
    //     prop: "customerContractNo",
    //     width: 250,
    // },
    {
        label: "客户名称",
        prop: "customerName",
        width: 250,
    minWidth: 100,
    },
    // {
    //     label: "项目名称",
    //     prop: "projectName",
    //     width:300
    // },
    {
        label: "产品大类",
        prop: "productCategory",
        width: 160,
        prop: "productName",
    minWidth: 100,
    },
    {
        label: "规格型号",
        prop: "specificationModel",
        width: 160,
        prop: "productModelName",
    minWidth: 100,
    },
    {
        label: "单位",
        prop: "unit",
    minWidth: 100,
    },
    {
        label: "工序",
        prop: "process",
    minWidth: 100,
    },
    {
        label: "生产数量",
        prop: "finishedNum",
        width: 100,
        prop: "quantity",
    minWidth: 100,
    },
    {
        label: "工时定额",
        prop: "workHours",
        width: 100,
    minWidth: 100,
    },
    {
        label: "工资",
        prop: "wages",
        width: 100,
    minWidth: 100,
    },
]);
@@ -120,27 +112,31 @@
    {
        label: "生产人",
        prop: "schedulingUserName",
        width: 120,
    minWidth: 100,
    },
    {
        label: "产量",
        prop: "finishedNum",
        width: 100,
    },
        prop: "outputNum",
    minWidth: 100,
  },
    {
        label: "工资",
        prop: "wages",
        width: 100,
    minWidth: 100,
    },
    {
        label: "合格率",
        prop: "qualifiedRate",
        width: 100,
        prop: "outputRate",
    minWidth: 100,
    },
]);
const tableData = ref([]);
const tableLoading = ref(false);
const tableLoading1 = ref(false);
const leftTableData = ref([]);
// 日 / 月 切换(默认按日)
const dateType = ref("day");
@@ -148,6 +144,12 @@
    current: 1,
    size: 100,
    total: 0,
});
const page1 = reactive({
  current: 1,
  size: 100,
  total: 0,
});
const data = reactive({
@@ -164,17 +166,18 @@
});
const { searchForm } = toRefs(data);
// 查询列表
/** 搜索按钮操作 */
const handleQuery = () => {
    page.current = 1;
    getList();
};
const pagination = (obj) => {
    page.current = obj.page;
    page.size = obj.limit;
    getList();
};
const pagination1 = (obj) => {
  page1.current = obj.page;
  page1.size = obj.limit;
    getList1();
};
const changeDaterange = (value) => {
    if (value) {
        searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
@@ -190,13 +193,24 @@
    const params = { ...searchForm.value, ...page };
    params.dateType = dateType.value;
    params.entryDate = undefined
    productionAccountingListPage(params).then((res) => {
  salesLedgerProductionAccountingList(params).then((res) => {
        tableLoading.value = false;
        const records = res.data.records || [];
        tableData.value = records;
    leftTableData.value = records;
        page.total = res.data.total || 0;
        buildLeftTableData(records);
    });
};
const getList1 = () => {
  tableLoading1.value = true;
  const params = { ...page1, ...searchForm.value };
  salesLedgerProductionAccountingListProductionDetails(params).then((res) => {
    tableLoading1.value = false;
    tableData.value = res.data.records || [];;
    page1.total = res.data.total || 0;
  });
};
// 构建左侧汇总台账(按生产人汇总产量、工资等)
@@ -225,7 +239,9 @@
// 左侧日/月切换
const handleDateTypeChange = () => {
    // 这里只作为筛选条件的一部分,直接重新查询列表
    handleQuery();
  page.current = 1;
    getList();
  handleQuery()
};
// 点击左侧行,刷右侧明细(按生产人过滤)
@@ -233,6 +249,14 @@
    searchForm.value.schedulingUserName = row.schedulingUserName || "";
    handleQuery();
};
// 查询列表
/** 搜索按钮操作 */
const handleQuery = () => {
  page1.current = 1;
  getList1();
};
// 导出
const handleOut = () => {
@@ -257,12 +281,12 @@
<style scoped lang="scss">
.content-layout {
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.left-panel {
  flex: 0 0 50%;
  max-width: 50%;
  display: flex;
  flex-direction: column;
  gap: 10px;
@@ -270,7 +294,6 @@
.right-panel {
  flex: 0 0 50%;
  max-width: 49%;
  display: flex;
  flex-direction: column;
  gap: 10px;
src/views/salesManagement/salesLedger/index.vue
@@ -1362,15 +1362,47 @@
            proxy.$modal.msg("已取消");
        });
};
/** 判断销售订单下是否存在已发货/发货完成的产品(不可删除) */
const hasShippedProducts = (products) => {
    if (!products || !products.length) return false;
    return products.some((p) => {
        const status = String(p.shippingStatus || "").trim();
        // 有发货日期或车牌号视为已发货
        if (p.shippingDate || p.shippingCarNumber) return true;
        // 已进行发货、发货完成、已发货 均不可删除
        return status === "已进行发货" || status === "发货完成" || status === "已发货";
    });
};
// 删除
const handleDelete = () => {
    let ids = [];
    if (selectedRows.value.length > 0) {
        ids = selectedRows.value.map((item) => item.id);
    } else {
const handleDelete = async () => {
    if (selectedRows.value.length === 0) {
        proxy.$modal.msgWarning("请选择数据");
        return;
    }
    const ids = selectedRows.value.map((item) => item.id);
    // 检查是否有已进行发货或发货完成的销售订单,若有则不允许删除
    const cannotDeleteNames = [];
    for (const row of selectedRows.value) {
        let products = row.children && row.children.length > 0 ? row.children : null;
        if (!products) {
            try {
                const res = await productList({ salesLedgerId: row.id, type: 1 });
                products = res.data || [];
            } catch {
                products = [];
            }
        }
        if (hasShippedProducts(products)) {
            cannotDeleteNames.push(row.salesContractNo || `ID:${row.id}`);
        }
    }
    if (cannotDeleteNames.length > 0) {
        proxy.$modal.msgWarning("已进行发货或发货完成的销售订单不能删除:" + cannotDeleteNames.join("、"));
        return;
    }
    ElMessageBox.confirm("选中的内容将被删除,是否确认删除?", "导出", {
        confirmButtonText: "确认",
        cancelButtonText: "取消",
@@ -2119,7 +2151,7 @@
}
::v-deep .red {
  background-color: #f80202;
  background-color: #FAE1DE;
}
::v-deep .purple{