Merge branch 'main' of http://e19510c831.iok.la/admin/zhyc-sheep-ui
This commit is contained in:
commit
7be1701e9b
61
src/api/embryo/flush.js
Normal file
61
src/api/embryo/flush.js
Normal file
@ -0,0 +1,61 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询冲胚记录列表
|
||||
export function listFlush(query) {
|
||||
return request({
|
||||
url: '/embryo/flush/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询冲胚记录详细
|
||||
export function getFlush(id) {
|
||||
return request({
|
||||
url: '/embryo/flush/' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增冲胚记录
|
||||
export function addFlush(data) {
|
||||
return request({
|
||||
url: '/embryo/flush',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改冲胚记录
|
||||
export function updateFlush(data) {
|
||||
return request({
|
||||
url: '/embryo/flush',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除冲胚记录
|
||||
export function delFlush(id) {
|
||||
return request({
|
||||
url: '/embryo/flush/' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 根据供体母羊耳号获取关联信息
|
||||
export function getDonorInfo(donorFemaleNo) {
|
||||
return request({
|
||||
url: '/embryo/flush/getDonorInfo',
|
||||
method: 'get',
|
||||
params: { donorFemaleNo }
|
||||
})
|
||||
}
|
||||
|
||||
// 获取供体母羊下拉列表
|
||||
export function getDonorFemaleList() {
|
||||
return request({
|
||||
url: '/embryo/flush/donorFemaleList',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
70
src/api/frozen/embryo.js
Normal file
70
src/api/frozen/embryo.js
Normal file
@ -0,0 +1,70 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询冻胚库存列表
|
||||
export function listEmbryo(query) {
|
||||
return request({
|
||||
url: '/frozen/embryo/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询冻胚库存详细
|
||||
export function getEmbryo(id) {
|
||||
return request({
|
||||
url: '/frozen/embryo/' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增冻胚库存
|
||||
export function addEmbryo(data) {
|
||||
return request({
|
||||
url: '/frozen/embryo',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改冻胚库存
|
||||
export function updateEmbryo(data) {
|
||||
return request({
|
||||
url: '/frozen/embryo',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除冻胚库存
|
||||
export function delEmbryo(id) {
|
||||
return request({
|
||||
url: '/frozen/embryo/' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 根据供体母羊耳号回显冲胚信息(冻胚新增页面用)
|
||||
export function getFlushInfoByEwe(eweNo) {
|
||||
return request({
|
||||
url: '/frozen/embryo/getFlushInfoByEwe/' + eweNo,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 根据母羊+等级获取数量
|
||||
export function getQtyByGrade(eweNo, grade) {
|
||||
return request({
|
||||
url: '/frozen/embryo/getQtyByGrade',
|
||||
method: 'get',
|
||||
params: { eweNo, grade }
|
||||
})
|
||||
}
|
||||
|
||||
// 废弃冻胚
|
||||
export function discardEmbryo(data) {
|
||||
return request({
|
||||
url: '/frozen/embryo/discard',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
44
src/api/frozen/sale.js
Normal file
44
src/api/frozen/sale.js
Normal file
@ -0,0 +1,44 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询销售主单列表
|
||||
export function listSale(query) {
|
||||
return request({
|
||||
url: '/sale/sale/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询销售主单详细
|
||||
export function getSale(id) {
|
||||
return request({
|
||||
url: '/sale/sale/' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增销售主单
|
||||
export function addSale(data) {
|
||||
return request({
|
||||
url: '/sale/sale',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改销售主单
|
||||
export function updateSale(data) {
|
||||
return request({
|
||||
url: '/sale/sale',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除销售主单
|
||||
export function delSale(id) {
|
||||
return request({
|
||||
url: '/sale/sale/' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
44
src/api/frozen/sperm.js
Normal file
44
src/api/frozen/sperm.js
Normal file
@ -0,0 +1,44 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询冻精库存列表
|
||||
export function listSperm(query) {
|
||||
return request({
|
||||
url: '/sperm/sperm/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询冻精库存详细
|
||||
export function getSperm(id) {
|
||||
return request({
|
||||
url: '/sperm/sperm/' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增冻精库存
|
||||
export function addSperm(data) {
|
||||
return request({
|
||||
url: '/sperm/sperm',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改冻精库存
|
||||
export function updateSperm(data) {
|
||||
return request({
|
||||
url: '/sperm/sperm',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除冻精库存
|
||||
export function delSperm(id) {
|
||||
return request({
|
||||
url: '/sperm/sperm/' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
@ -37,6 +37,8 @@
|
||||
<el-select v-model="queryParams.breedType" placeholder="请选择配种方式" clearable>
|
||||
<el-option label="同期发情" value="1"></el-option>
|
||||
<el-option label="本交" value="2"></el-option>
|
||||
<el-option label="冲胚" value="3"></el-option>
|
||||
<el-option label="自然发情人工授精" value="4"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="技术员" prop="technician">
|
||||
@ -132,7 +134,7 @@
|
||||
:default-sort="{prop: 'createTime', order: 'descending'}"
|
||||
>
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<!-- 创建日期作为第一列,支持排序 -->
|
||||
<!-- 创建日期作为第一列,支持排序 -->
|
||||
<el-table-column
|
||||
label="创建日期"
|
||||
align="center"
|
||||
@ -155,7 +157,7 @@
|
||||
</el-table-column>
|
||||
<el-table-column label="配种公羊" align="center" prop="ramManageTags" width="120" />
|
||||
<el-table-column label="配种公羊品种" align="center" prop="ramVariety" width="120" />
|
||||
<el-table-column label="配种方式" align="center" prop="matingType" width="100">
|
||||
<el-table-column label="配种方式" align="center" prop="matingType" width="140">
|
||||
<template #default="scope">
|
||||
<span>{{ getBreedTypeText(scope.row.breedType) }}</span>
|
||||
</template>
|
||||
@ -259,6 +261,8 @@
|
||||
<el-select v-model="form.breedType" placeholder="请选择配种方式">
|
||||
<el-option label="同期发情" :value="1"></el-option>
|
||||
<el-option label="本交" :value="2"></el-option>
|
||||
<el-option label="冲胚" :value="3"></el-option>
|
||||
<el-option label="自然发情人工授精" :value="4"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@ -337,7 +341,7 @@
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<!-- 显示孕检信息区域(如果已有孕检记录) -->
|
||||
<!-- 显示孕检信息区域(如果已有孕检记录) -->
|
||||
<el-row v-if="form.pregnancyResult">
|
||||
<el-col :span="24">
|
||||
<el-divider content-position="left">孕检信息</el-divider>
|
||||
@ -452,6 +456,8 @@ const {queryParams, form, rules} = toRefs(data)
|
||||
function getBreedTypeText(breedType) {
|
||||
if (breedType === 1) return '同期发情'
|
||||
if (breedType === 2) return '本交'
|
||||
if (breedType === 3) return '冲胚'
|
||||
if (breedType === 4) return '自然发情人工授精'
|
||||
return '-'
|
||||
}
|
||||
|
||||
@ -549,7 +555,7 @@ function handleUpdate(row) {
|
||||
open.value = true
|
||||
title.value = "修改配种记录"
|
||||
|
||||
// 如果有母羊耳号,加载母羊信息
|
||||
// 如果有母羊耳号,加载母羊信息
|
||||
if (form.value.eweManageTags) {
|
||||
getEweInfoAndPlan()
|
||||
}
|
||||
@ -573,11 +579,11 @@ function getEweInfoAndPlan() {
|
||||
eweInfo.value = null
|
||||
})
|
||||
|
||||
// 获取配种计划信息(使用最新的获取方法)
|
||||
// 获取配种计划信息(使用最新的获取方法)
|
||||
getLatestBreedPlanByEweTags(form.value.eweManageTags).then(response => {
|
||||
if (response.data) {
|
||||
breedPlan.value = response.data
|
||||
// 自动填充公羊耳号和配种方式(但允许用户修改)
|
||||
// 自动填充公羊耳号和配种方式(但允许用户修改)
|
||||
if (!form.value.ramManageTags) {
|
||||
form.value.ramManageTags = response.data.ram_manage_tags
|
||||
}
|
||||
@ -585,13 +591,13 @@ function getEweInfoAndPlan() {
|
||||
form.value.breedType = response.data.breed_type
|
||||
}
|
||||
|
||||
proxy.$modal.msgSuccess("已自动匹配配种计划信息,可手动调整")
|
||||
proxy.$modal.msgSuccess("已自动匹配配种计划信息,可手动调整")
|
||||
} else {
|
||||
breedPlan.value = null
|
||||
proxy.$modal.msgWarning("未找到该母羊的配种计划,请手动输入配种信息")
|
||||
proxy.$modal.msgWarning("未找到该母羊的配种计划,请手动输入配种信息")
|
||||
}
|
||||
}).catch(() => {
|
||||
proxy.$modal.msgWarning("查询配种计划失败,请手动输入配种信息")
|
||||
proxy.$modal.msgWarning("查询配种计划失败,请手动输入配种信息")
|
||||
breedPlan.value = null
|
||||
})
|
||||
}
|
||||
@ -636,7 +642,7 @@ function submitForm() {
|
||||
/** 删除按钮操作 */
|
||||
function handleDelete(row) {
|
||||
const _ids = row.id || ids.value
|
||||
proxy.$modal.confirm('是否确认删除配种记录编号为"' + _ids + '"的数据项?').then(function () {
|
||||
proxy.$modal.confirm('是否确认删除配种记录编号为"' + _ids + '"的数据项?').then(function () {
|
||||
return delBreeding_records(_ids)
|
||||
}).then(() => {
|
||||
getList()
|
||||
|
||||
@ -1,17 +1,18 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<!-- 搜索表单 -->
|
||||
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form-item label="年月" prop="datetime">
|
||||
<el-date-picker clearable
|
||||
v-model="queryParams.datetime"
|
||||
type="month"
|
||||
value-format="YYYY-MM"
|
||||
placeholder="请选择年月">
|
||||
</el-date-picker>
|
||||
<el-form-item label="年月" style="width: 308px">
|
||||
<el-date-picker
|
||||
v-model="dateRange"
|
||||
type="monthrange"
|
||||
value-format="YYYY-MM-DD"
|
||||
range-separator="-"
|
||||
start-placeholder="开始月份"
|
||||
end-placeholder="结束月份"
|
||||
></el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="厂区" prop="factory">
|
||||
<el-select v-model="queryParams.factory" placeholder="请选择厂区" clearable>
|
||||
<el-select v-model="queryParams.factory" placeholder="请选择厂区" clearable style="width: 240px">
|
||||
<el-option
|
||||
v-for="dict in da_ranch"
|
||||
:key="dict.value"
|
||||
@ -26,7 +27,6 @@
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<!-- 操作按钮区域 -->
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
@ -69,14 +69,13 @@
|
||||
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<!-- 数据表格 -->
|
||||
<el-table
|
||||
v-loading="loading"
|
||||
:data="dryMatterCorrectionList"
|
||||
@selection-change="handleSelectionChange"
|
||||
style="width: 100%">
|
||||
<el-table-column type="selection" align="center" />
|
||||
<el-table-column label="年月" align="center" prop="datetime">
|
||||
<el-table-column label="年月" align="center" prop="datetime" sortable>
|
||||
<template #default="scope">
|
||||
<span>{{ parseTime(scope.row.datetime, '{y}-{m}') }}</span>
|
||||
</template>
|
||||
@ -86,11 +85,10 @@
|
||||
<dict-tag :options="da_ranch" :value="scope.row.factory"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="干物质含量" align="center" prop="content" />
|
||||
<el-table-column label="干物质标准" align="center" prop="standard" />
|
||||
<el-table-column label="干物质系数" align="center" prop="coefficient">
|
||||
<el-table-column label="干物质含量" align="center" prop="content" sortable />
|
||||
<el-table-column label="干物质标准" align="center" prop="standard" sortable />
|
||||
<el-table-column label="干物质系数" align="center" prop="coefficient" sortable>
|
||||
<template #default="scope">
|
||||
<!-- 修复:确保显示两位小数 -->
|
||||
<span>{{ formatCoefficient(scope.row.coefficient) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@ -102,16 +100,15 @@
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!-- 分页组件 -->
|
||||
<pagination
|
||||
v-show="total>0"
|
||||
:total="total"
|
||||
v-model:page="queryParams.pageNum"
|
||||
v-model:limit="queryParams.pageSize"
|
||||
:page-sizes="[20, 50, 100, 200, 500, 1000, 2000]"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
<!-- 添加/修改对话框 -->
|
||||
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
|
||||
<el-form ref="dryMatterCorrectionRef" :model="form" :rules="rules" label-width="100px">
|
||||
<el-form-item label="年月" prop="datetime">
|
||||
@ -140,7 +137,6 @@
|
||||
<el-input v-model="form.standard" placeholder="请输入干物质标准" @input="calculateCoefficient" />
|
||||
</el-form-item>
|
||||
<el-form-item label="干物质系数">
|
||||
<!-- 修复:确保显示两位小数 -->
|
||||
<el-input :value="formatCoefficient(form.coefficient)" placeholder="自动计算" readonly>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
@ -156,7 +152,6 @@
|
||||
</template>
|
||||
|
||||
<script setup name="DryMatterCorrection">
|
||||
// 导入API方法
|
||||
import {
|
||||
listDryMatterCorrection,
|
||||
getDryMatterCorrection,
|
||||
@ -164,11 +159,11 @@ import {
|
||||
addDryMatterCorrection,
|
||||
updateDryMatterCorrection
|
||||
} from "@/api/dairyProducts/dryMatterCorrection/dryMatterCorrection.js"
|
||||
import { getCurrentInstance, ref, reactive, toRefs } from 'vue'
|
||||
|
||||
const { proxy } = getCurrentInstance()
|
||||
const { da_ranch } = proxy.useDict('da_ranch')
|
||||
|
||||
// 响应式数据
|
||||
const dryMatterCorrectionList = ref([])
|
||||
const open = ref(false)
|
||||
const loading = ref(true)
|
||||
@ -178,30 +173,28 @@ const single = ref(true)
|
||||
const multiple = ref(true)
|
||||
const total = ref(0)
|
||||
const title = ref("")
|
||||
const dateRange = ref([]) // 新增:日期范围变量
|
||||
|
||||
// 使用reactive创建响应式对象
|
||||
const data = reactive({
|
||||
form: {
|
||||
coefficient: null,
|
||||
standard: 18 // 设置默认值为18
|
||||
},
|
||||
queryParams: {
|
||||
// 修复:直接使用 reactive 定义 queryParams,解决下拉框回显和响应式丢失问题
|
||||
const queryParams = reactive({
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
pageSize: 20, // 默认20条
|
||||
factory: null,
|
||||
// datetime 字段已移除,后端使用 params.beginTime 和 params.endTime
|
||||
})
|
||||
|
||||
const form = ref({
|
||||
id: null,
|
||||
datetime: null,
|
||||
factory: null,
|
||||
},
|
||||
rules: {
|
||||
datetime: [{
|
||||
required: true,
|
||||
message: "年月不能为空",
|
||||
trigger: "blur"
|
||||
}],
|
||||
factory: [{
|
||||
required: true,
|
||||
message: "厂区不能为空",
|
||||
trigger: "blur"
|
||||
}],
|
||||
content: null,
|
||||
standard: 18,
|
||||
coefficient: null
|
||||
})
|
||||
|
||||
const rules = {
|
||||
datetime: [{ required: true, message: "年月不能为空", trigger: "blur" }],
|
||||
factory: [{ required: true, message: "厂区不能为空", trigger: "blur" }],
|
||||
content: [
|
||||
{ required: true, message: "干物质含量不能为空", trigger: "blur" },
|
||||
{ pattern: /^\d+(\.\d+)?$/, message: "请输入有效数字", trigger: "blur" }
|
||||
@ -218,19 +211,13 @@ const data = reactive({
|
||||
}, trigger: "blur" }
|
||||
]
|
||||
}
|
||||
})
|
||||
|
||||
const { queryParams, form, rules } = toRefs(data)
|
||||
|
||||
/** 格式化系数显示,保留两位小数 */
|
||||
function formatCoefficient(value) {
|
||||
if (value === null || value === undefined) return '';
|
||||
// 确保是数字类型,然后保留两位小数
|
||||
const num = typeof value === 'string' ? parseFloat(value) : value;
|
||||
return !isNaN(num) ? num.toFixed(2) : '';
|
||||
}
|
||||
|
||||
/** 计算干物质系数 - 保留两位小数 */
|
||||
function calculateCoefficient() {
|
||||
if (form.value.content && form.value.standard && form.value.standard != 0) {
|
||||
const content = parseFloat(form.value.content);
|
||||
@ -244,66 +231,65 @@ function calculateCoefficient() {
|
||||
/** 查询干物质校正列表 */
|
||||
function getList() {
|
||||
loading.value = true
|
||||
listDryMatterCorrection(queryParams.value).then(response => {
|
||||
// 处理日期范围
|
||||
// 注意:虽然是月份选择,为了配合后端 SQL 的 DATE_FORMAT 解析,建议传完整的日期字符串
|
||||
proxy.addDateRange(queryParams, dateRange.value)
|
||||
|
||||
listDryMatterCorrection(queryParams).then(response => {
|
||||
dryMatterCorrectionList.value = response.rows
|
||||
total.value = response.total
|
||||
loading.value = false
|
||||
})
|
||||
}
|
||||
|
||||
// 取消按钮
|
||||
function cancel() {
|
||||
open.value = false
|
||||
reset()
|
||||
}
|
||||
|
||||
// 表单重置
|
||||
function reset() {
|
||||
form.value = {
|
||||
id: null,
|
||||
datetime: null,
|
||||
factory: null,
|
||||
content: null,
|
||||
standard: 18, // 重置时也设置默认值为18
|
||||
standard: 18,
|
||||
coefficient: null
|
||||
}
|
||||
proxy.resetForm("dryMatterCorrectionRef")
|
||||
}
|
||||
|
||||
|
||||
/** 搜索按钮操作 */
|
||||
function handleQuery() {
|
||||
queryParams.value.pageNum = 1
|
||||
queryParams.pageNum = 1
|
||||
getList()
|
||||
}
|
||||
|
||||
/** 重置按钮操作 */
|
||||
function resetQuery() {
|
||||
dateRange.value = [] // 清空日期范围
|
||||
queryParams.factory = null // 显式重置下拉框绑定值
|
||||
proxy.resetForm("queryRef")
|
||||
handleQuery()
|
||||
}
|
||||
|
||||
// 多选框选中数据
|
||||
function handleSelectionChange(selection) {
|
||||
ids.value = selection.map(item => item.id)
|
||||
single.value = selection.length != 1
|
||||
multiple.value = !selection.length
|
||||
}
|
||||
|
||||
/** 新增按钮操作 */
|
||||
function handleAdd() {
|
||||
reset()
|
||||
open.value = true
|
||||
title.value = "添加干物质校正"
|
||||
}
|
||||
|
||||
/** 修改按钮操作 */
|
||||
function handleUpdate(row) {
|
||||
reset()
|
||||
const _id = row.id || ids.value
|
||||
getDryMatterCorrection(_id).then(response => {
|
||||
form.value = response.data
|
||||
// 确保系数已计算
|
||||
if (form.value.content && form.value.standard) {
|
||||
form.value.coefficient = form.value.content / form.value.standard;
|
||||
}
|
||||
@ -316,49 +302,33 @@ function handleUpdate(row) {
|
||||
})
|
||||
}
|
||||
|
||||
/** 提交按钮 */
|
||||
function submitForm() {
|
||||
proxy.$refs["dryMatterCorrectionRef"].validate(valid => {
|
||||
if (valid) {
|
||||
// 确保系数已计算
|
||||
// 重新计算确保数据准确
|
||||
if (form.value.content && form.value.standard && form.value.standard != 0) {
|
||||
const content = parseFloat(form.value.content);
|
||||
const standard = parseFloat(form.value.standard);
|
||||
form.value.coefficient = Math.round((content / standard) * 100) / 100;
|
||||
}
|
||||
|
||||
if (form.value.id != null) {
|
||||
updateDryMatterCorrection(form.value).then(response => {
|
||||
proxy.$modal.msgSuccess("修改成功")
|
||||
open.value = false
|
||||
getList()
|
||||
const request = form.value.id ? updateDryMatterCorrection(form.value) : addDryMatterCorrection(form.value);
|
||||
|
||||
request.then(response => {
|
||||
proxy.$modal.msgSuccess(form.value.id ? "修改成功" : "新增成功");
|
||||
open.value = false;
|
||||
getList();
|
||||
}).catch(error => {
|
||||
// 捕获重复记录的错误
|
||||
if (error.message && error.message.includes("已存在记录")) {
|
||||
proxy.$modal.msgError(error.message);
|
||||
} else {
|
||||
proxy.$modal.msgError("修改失败:" + (error.message || "未知错误"));
|
||||
}
|
||||
})
|
||||
} else {
|
||||
addDryMatterCorrection(form.value).then(response => {
|
||||
proxy.$modal.msgSuccess("新增成功")
|
||||
open.value = false
|
||||
getList()
|
||||
}).catch(error => {
|
||||
// 捕获重复记录的错误
|
||||
if (error.message && error.message.includes("已存在记录")) {
|
||||
proxy.$modal.msgError(error.message);
|
||||
} else {
|
||||
proxy.$modal.msgError("新增失败:" + (error.message || "未知错误"));
|
||||
}
|
||||
})
|
||||
proxy.$modal.msgError((form.value.id ? "修改" : "新增") + "失败:" + (error.message || "未知错误"));
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/** 删除按钮操作 */
|
||||
function handleDelete(row) {
|
||||
const _ids = row.id || ids.value
|
||||
proxy.$modal.confirm('是否确认删除干物质校正编号为"' + _ids + '"的数据项?').then(function() {
|
||||
@ -369,10 +339,9 @@ function handleDelete(row) {
|
||||
}).catch(() => {})
|
||||
}
|
||||
|
||||
/** 导出按钮操作 */
|
||||
function handleExport() {
|
||||
proxy.download('dryMatterCorrection/dryMatterCorrection/export', {
|
||||
...queryParams.value
|
||||
...queryParams
|
||||
}, `干物质校正数据_${new Date().getTime()}.xlsx`)
|
||||
}
|
||||
|
||||
@ -380,36 +349,27 @@ getList()
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* 添加表格样式 */
|
||||
.el-table {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.el-table th {
|
||||
background-color: #f5f7fa;
|
||||
color: #606266;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.el-table td, .el-table th {
|
||||
padding: 12px 0;
|
||||
}
|
||||
|
||||
.el-table .cell {
|
||||
padding: 0 15px;
|
||||
}
|
||||
|
||||
/* 调整操作列按钮间距 */
|
||||
.el-button + .el-button {
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
/* 调整表单元素宽度 */
|
||||
/* 确保表单元素宽度一致 */
|
||||
.el-input, .el-select {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/* 调整搜索表单布局 */
|
||||
.el-form-item {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<!-- 简化查询表单 -->
|
||||
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="80px">
|
||||
<el-form-item label="来源" prop="source">
|
||||
<el-input
|
||||
@ -10,13 +9,15 @@
|
||||
@keyup.enter="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="检测日期" prop="datetime">
|
||||
<el-date-picker clearable
|
||||
v-model="queryParams.datetime"
|
||||
type="date"
|
||||
<el-form-item label="检测日期" style="width: 308px">
|
||||
<el-date-picker
|
||||
v-model="dateRange"
|
||||
value-format="YYYY-MM-DD"
|
||||
placeholder="请选择检测日期">
|
||||
</el-date-picker>
|
||||
type="daterange"
|
||||
range-separator="-"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
></el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
||||
@ -74,7 +75,6 @@
|
||||
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<!-- 表格显示,使用列选择功能 -->
|
||||
<el-table v-loading="loading" :data="freshMilkTestList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column
|
||||
@ -87,71 +87,86 @@
|
||||
align="center"
|
||||
prop="datetime"
|
||||
width="180"
|
||||
v-if="selectedColumns.includes('datetime')">
|
||||
v-if="selectedColumns.includes('datetime')"
|
||||
sortable>
|
||||
<template #default="scope">
|
||||
<span>{{ formatDate(scope.row.datetime) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column
|
||||
label="脂肪g/100g"
|
||||
align="center"
|
||||
prop="fat"
|
||||
v-if="selectedColumns.includes('fat')" />
|
||||
v-if="selectedColumns.includes('fat')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="蛋白质g/100g"
|
||||
align="center"
|
||||
prop="protein"
|
||||
v-if="selectedColumns.includes('protein')" />
|
||||
v-if="selectedColumns.includes('protein')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="非脂g/100g"
|
||||
align="center"
|
||||
prop="nonFat"
|
||||
v-if="selectedColumns.includes('nonFat')" />
|
||||
v-if="selectedColumns.includes('nonFat')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="酸度oT"
|
||||
align="center"
|
||||
prop="acidity"
|
||||
v-if="selectedColumns.includes('acidity')" />
|
||||
v-if="selectedColumns.includes('acidity')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="菌落总数1"
|
||||
align="center"
|
||||
prop="bacterialColony1"
|
||||
v-if="selectedColumns.includes('bacterialColony1')" />
|
||||
v-if="selectedColumns.includes('bacterialColony1')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="菌落总数2"
|
||||
align="center"
|
||||
prop="bacterialColony2"
|
||||
v-if="selectedColumns.includes('bacterialColony2')" />
|
||||
v-if="selectedColumns.includes('bacterialColony2')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="菌落总数3"
|
||||
align="center"
|
||||
prop="bacterialColony3"
|
||||
v-if="selectedColumns.includes('bacterialColony3')" />
|
||||
v-if="selectedColumns.includes('bacterialColony3')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="菌落总数4"
|
||||
align="center"
|
||||
prop="bacterialColony4"
|
||||
v-if="selectedColumns.includes('bacterialColony4')" />
|
||||
v-if="selectedColumns.includes('bacterialColony4')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="菌落总数5"
|
||||
align="center"
|
||||
prop="bacterialColony5"
|
||||
v-if="selectedColumns.includes('bacterialColony5')" />
|
||||
v-if="selectedColumns.includes('bacterialColony5')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="大肠菌群(CFU/ml)"
|
||||
align="center"
|
||||
prop="coli"
|
||||
v-if="selectedColumns.includes('coli')" />
|
||||
v-if="selectedColumns.includes('coli')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="乳铁蛋白(mg/L)"
|
||||
align="center"
|
||||
prop="lactoferrin"
|
||||
v-if="selectedColumns.includes('lactoferrin')" />
|
||||
v-if="selectedColumns.includes('lactoferrin')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="免疫球蛋白(mg/L)"
|
||||
align="center"
|
||||
prop="ig"
|
||||
v-if="selectedColumns.includes('ig')" />
|
||||
v-if="selectedColumns.includes('ig')"
|
||||
sortable />
|
||||
|
||||
<el-table-column
|
||||
label="备注"
|
||||
align="center"
|
||||
@ -167,7 +182,8 @@
|
||||
align="center"
|
||||
prop="createTime"
|
||||
width="180"
|
||||
v-if="selectedColumns.includes('createTime')">
|
||||
v-if="selectedColumns.includes('createTime')"
|
||||
sortable>
|
||||
<template #default="scope">
|
||||
<span>{{ formatDateTime(scope.row.createTime) }}</span>
|
||||
</template>
|
||||
@ -185,10 +201,10 @@
|
||||
:total="total"
|
||||
v-model:page="queryParams.pageNum"
|
||||
v-model:limit="queryParams.pageSize"
|
||||
:page-sizes="[20, 50, 100, 200, 500, 1000, 2000]"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
<!-- 新增/修改对话框 -->
|
||||
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
|
||||
<el-form ref="freshMilkTestRef" :model="form" :rules="rules" label-width="120px">
|
||||
<el-form-item label="来源" prop="source">
|
||||
@ -257,7 +273,6 @@
|
||||
</template>
|
||||
</el-dialog>
|
||||
|
||||
<!-- 列显示设置对话框 -->
|
||||
<el-dialog title="列显示设置" v-model="columnShowDialogVisible" width="500px">
|
||||
<el-checkbox-group v-model="selectedColumns">
|
||||
<el-checkbox label="source">来源</el-checkbox>
|
||||
@ -288,13 +303,14 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, onMounted } from 'vue';
|
||||
import { ref, reactive, onMounted, getCurrentInstance } from 'vue';
|
||||
import { listFreshMilkTest, getFreshMilkTest, delFreshMilkTest, addFreshMilkTest, updateFreshMilkTest } from "@/api/dairyProducts/freshMilkTest/freshMilkTest.js";
|
||||
import { ElMessage, ElMessageBox } from 'element-plus';
|
||||
// 导入xlsx库和file-saver
|
||||
import * as XLSX from 'xlsx';
|
||||
import { saveAs } from 'file-saver';
|
||||
|
||||
const { proxy } = getCurrentInstance(); // 获取 proxy 用于处理日期范围
|
||||
|
||||
const freshMilkTestList = ref([]);
|
||||
const open = ref(false);
|
||||
const loading = ref(true);
|
||||
@ -306,6 +322,7 @@ const total = ref(0);
|
||||
const title = ref("");
|
||||
const columnShowDialogVisible = ref(false);
|
||||
const freshMilkTestRef = ref(null);
|
||||
const dateRange = ref([]); // 新增:日期范围变量
|
||||
|
||||
// 列配置映射
|
||||
const columnConfig = [
|
||||
@ -339,9 +356,9 @@ const selectedColumns = ref([
|
||||
// 查询参数
|
||||
const queryParams = reactive({
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
pageSize: 20, // 修改默认显示条数
|
||||
source: null,
|
||||
datetime: null,
|
||||
// datetime 已移除,使用 dateRange
|
||||
});
|
||||
|
||||
// 表单数据
|
||||
@ -385,6 +402,8 @@ const getCurrentUsername = () => {
|
||||
/** 查询列表 */
|
||||
function getList() {
|
||||
loading.value = true;
|
||||
// 处理日期范围
|
||||
proxy.addDateRange(queryParams, dateRange.value);
|
||||
listFreshMilkTest(queryParams).then(response => {
|
||||
freshMilkTestList.value = response.rows || [];
|
||||
total.value = response.total || 0;
|
||||
@ -471,9 +490,9 @@ function handleQuery() {
|
||||
|
||||
/** 重置按钮操作 */
|
||||
function resetQuery() {
|
||||
dateRange.value = []; // 清空日期范围
|
||||
Object.assign(queryParams, {
|
||||
source: null,
|
||||
datetime: null,
|
||||
});
|
||||
handleQuery();
|
||||
}
|
||||
|
||||
@ -1,35 +1,42 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="app-container">
|
||||
<el-form :inline="true" :model="queryParams" class="mb-4">
|
||||
<el-form-item label="开始日期">
|
||||
<el-date-picker v-model="queryParams.datetimeStart" type="date" value-format="YYYY-MM-DD"/>
|
||||
<el-form-item label="日期范围">
|
||||
<el-date-picker
|
||||
v-model="dateRange"
|
||||
type="daterange"
|
||||
value-format="YYYY-MM-DD"
|
||||
range-separator="-"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
style="width: 260px"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="结束日期">
|
||||
<el-date-picker v-model="queryParams.datetimeEnd" type="date" value-format="YYYY-MM-DD"/>
|
||||
</el-form-item>
|
||||
<el-button type="primary" @click="getList">查询</el-button>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="handleQuery">查询</el-button>
|
||||
<el-button @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-row :gutter="10" style="margin-bottom: 16px;">
|
||||
<el-col :span="24">
|
||||
<el-upload :before-upload="beforeUpload" :show-file-list="false" style="display: inline-block; margin: 0 8px;">
|
||||
<el-button type="primary">导入</el-button>
|
||||
<el-button type="info" plain icon="Upload">导入</el-button>
|
||||
</el-upload>
|
||||
<el-button type="success" @click="handleExport">导出</el-button>
|
||||
<el-button @click="openColDialog">列设置</el-button>
|
||||
<el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
|
||||
<el-button type="primary" plain icon="Menu" @click="openColDialog">列设置</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-dialog v-model="colDialog" title="选择展示列">
|
||||
<el-dialog v-model="colDialog" title="选择展示列" width="600px">
|
||||
<div>
|
||||
<strong>饲喂来源:</strong>
|
||||
<div style="margin-bottom: 10px; font-weight: bold;">饲喂来源:</div>
|
||||
<el-checkbox-group v-model="selectedFeed">
|
||||
<el-checkbox v-for="f in allCols.feed" :key="f" :label="f">{{ f }}</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
</div>
|
||||
<div style="margin-top:1em">
|
||||
<strong>销售去向:</strong>
|
||||
<div style="margin-top: 20px;">
|
||||
<div style="margin-bottom: 10px; font-weight: bold;">销售去向:</div>
|
||||
<el-checkbox-group v-model="selectedSale">
|
||||
<el-checkbox v-for="s in allCols.sale" :key="s" :label="s">{{ s }}</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
@ -42,43 +49,45 @@
|
||||
</template>
|
||||
</el-dialog>
|
||||
|
||||
<el-table :data="rows" border style="margin-top:16px">
|
||||
<!-- 前面的固定列 -->
|
||||
<el-table-column prop="datetime" label="日期"/>
|
||||
<el-table-column prop="num" label="羊数"/>
|
||||
<el-table-column prop="colostSheep" label="初乳羊"/>
|
||||
<el-table-column prop="commercialIntake" label="商乳入库"/>
|
||||
<el-table-column prop="antiIntake" label="抗乳入库"/>
|
||||
<el-table-column prop="colostIntake" label="初乳入库"/>
|
||||
<el-table-column prop="intakeTotal" label="入库小计"/>
|
||||
<el-table-column prop="commercialTest" label="商乳实验用奶"/>
|
||||
<el-table-column prop="colostTest" label="初乳实验用奶"/>
|
||||
<el-table-column prop="transferCommercial" label="商乳调拨出库"/>
|
||||
<el-table-column prop="transferAnti" label="抗乳调拨出库"/>
|
||||
<el-table-column prop="transferColost" label="初乳调拨出库"/>
|
||||
<el-table-column prop="transferTotal" label="调拨小计"/>
|
||||
<el-table-column prop="loss" label="损耗"/>
|
||||
<el-table :data="rows" border style="margin-top:16px" v-loading="loading">
|
||||
<el-table-column prop="datetime" label="日期" width="120" sortable fixed="left">
|
||||
<template #default="{ row }">
|
||||
{{ row.datetime ? row.datetime.substring(0, 10) : '' }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<!-- 动态饲喂来源列(插入到这里) -->
|
||||
<el-table-column v-for="f in selectedFeed" :key="'feed-'+f" :prop="f" :label="f"/>
|
||||
<!-- 动态销售去向列 -->
|
||||
<el-table-column v-for="s in selectedSale" :key="'sale-'+s" :prop="s" :label="s"/>
|
||||
<el-table-column prop="num" label="羊数" sortable width="100" />
|
||||
<el-table-column prop="colostSheep" label="初乳羊" sortable width="100" />
|
||||
<el-table-column prop="commercialIntake" label="商乳入库" sortable width="120" />
|
||||
<el-table-column prop="antiIntake" label="抗乳入库" sortable width="120" />
|
||||
<el-table-column prop="colostIntake" label="初乳入库" sortable width="120" />
|
||||
<el-table-column prop="intakeTotal" label="入库小计" sortable width="120" />
|
||||
<el-table-column prop="commercialTest" label="商乳实验用奶" sortable width="140" />
|
||||
<el-table-column prop="colostTest" label="初乳实验用奶" sortable width="140" />
|
||||
<el-table-column prop="transferCommercial" label="商乳调拨出库" sortable width="140" />
|
||||
<el-table-column prop="transferAnti" label="抗乳调拨出库" sortable width="140" />
|
||||
<el-table-column prop="transferColost" label="初乳调拨出库" sortable width="140" />
|
||||
<el-table-column prop="transferTotal" label="调拨小计" sortable width="120" />
|
||||
<el-table-column prop="loss" label="损耗" sortable width="100" />
|
||||
|
||||
<!-- 后面的固定列 -->
|
||||
<el-table-column prop="stockCommercial" label="商乳库存"/>
|
||||
<el-table-column prop="stockAnti" label="抗乳库存"/>
|
||||
<el-table-column prop="colost" label="初乳库存"/>
|
||||
<el-table-column prop="returnFresh" label="爱特退回鲜奶"/>
|
||||
<el-table-column prop="returnYogurt" label="爱特退回酸奶"/>
|
||||
<el-table-column v-for="f in selectedFeed" :key="'feed-'+f" :prop="f" :label="f" sortable width="120" />
|
||||
<el-table-column v-for="s in selectedSale" :key="'sale-'+s" :prop="s" :label="s" sortable width="120" />
|
||||
|
||||
<el-table-column prop="stockCommercial" label="商乳库存" sortable width="120" />
|
||||
<el-table-column prop="stockAnti" label="抗乳库存" sortable width="120" />
|
||||
<el-table-column prop="colost" label="初乳库存" sortable width="120" />
|
||||
<el-table-column prop="returnFresh" label="爱特退回鲜奶" sortable width="140" />
|
||||
<el-table-column prop="returnYogurt" label="爱特退回酸奶" sortable width="140" />
|
||||
</el-table>
|
||||
|
||||
<el-pagination
|
||||
style="margin-top:16px; text-align:right"
|
||||
<pagination
|
||||
v-show="total>0"
|
||||
:total="total"
|
||||
v-model:page-size="queryParams.pageSize"
|
||||
v-model:current-page="queryParams.pageNum"
|
||||
@current-change="getList">
|
||||
</el-pagination>
|
||||
v-model:page="queryParams.pageNum"
|
||||
v-model:limit="queryParams.pageSize"
|
||||
:page-sizes="[20, 50, 100, 200, 500, 1000, 2000]"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
@ -88,12 +97,14 @@ import { ref, reactive, onMounted } from 'vue'
|
||||
import { getList as fetchList, importExcel, exportExcel, getColumns } from '@/api/dairyProducts/milkInOutStore/milkInOutStore.js'
|
||||
import { ElMessage } from 'element-plus'
|
||||
|
||||
const loading = ref(false)
|
||||
const queryParams = reactive({
|
||||
datetimeStart: null,
|
||||
datetimeEnd: null,
|
||||
pageNum: 1,
|
||||
pageSize: 10
|
||||
pageSize: 20 // 默认每页20条
|
||||
})
|
||||
const dateRange = ref([]) // 新增:日期范围变量
|
||||
const rows = ref([])
|
||||
const total = ref(0)
|
||||
const allCols = reactive({ feed: [], sale: [] })
|
||||
@ -102,13 +113,34 @@ const selectedSale = ref([])
|
||||
const colDialog = ref(false)
|
||||
|
||||
function getList() {
|
||||
loading.value = true
|
||||
|
||||
// 处理日期范围
|
||||
if (dateRange.value && dateRange.value.length === 2) {
|
||||
queryParams.datetimeStart = dateRange.value[0];
|
||||
queryParams.datetimeEnd = dateRange.value[1];
|
||||
} else {
|
||||
queryParams.datetimeStart = null;
|
||||
queryParams.datetimeEnd = null;
|
||||
}
|
||||
|
||||
fetchList(queryParams).then(res => {
|
||||
rows.value = res.rows
|
||||
total.value = res.total
|
||||
loading.value = false
|
||||
}).catch(err => {
|
||||
loading.value = false
|
||||
console.error(err)
|
||||
})
|
||||
}
|
||||
|
||||
function handleQuery() {
|
||||
queryParams.pageNum = 1
|
||||
getList()
|
||||
}
|
||||
|
||||
function resetQuery() {
|
||||
dateRange.value = [] // 重置日期
|
||||
queryParams.datetimeStart = null
|
||||
queryParams.datetimeEnd = null
|
||||
queryParams.pageNum = 1
|
||||
@ -120,9 +152,13 @@ function openColDialog() {
|
||||
const d = res.data[0]
|
||||
allCols.feed = d.feed || []
|
||||
allCols.sale = d.sale || []
|
||||
// 默认勾选所有源/销项列
|
||||
|
||||
// 如果还没选过,默认全选;否则保持当前选择
|
||||
if (selectedFeed.value.length === 0 && selectedSale.value.length === 0) {
|
||||
selectedFeed.value = [...allCols.feed]
|
||||
selectedSale.value = [...allCols.sale]
|
||||
}
|
||||
|
||||
colDialog.value = true
|
||||
})
|
||||
}
|
||||
@ -143,15 +179,44 @@ function beforeUpload(file) {
|
||||
}
|
||||
|
||||
function handleExport() {
|
||||
// 导出前确认日期参数
|
||||
if (dateRange.value && dateRange.value.length === 2) {
|
||||
queryParams.datetimeStart = dateRange.value[0];
|
||||
queryParams.datetimeEnd = dateRange.value[1];
|
||||
} else {
|
||||
queryParams.datetimeStart = null;
|
||||
queryParams.datetimeEnd = null;
|
||||
}
|
||||
|
||||
exportExcel(queryParams).then(blob => {
|
||||
const link = document.createElement('a')
|
||||
link.href = URL.createObjectURL(blob)
|
||||
link.download = `milk_in_out_store_${Date.now()}.xlsx`
|
||||
link.click()
|
||||
URL.revokeObjectURL(link.href)
|
||||
}).catch(err => {
|
||||
ElMessage.error('导出失败:' + (err.message || err))
|
||||
})
|
||||
}
|
||||
|
||||
onMounted(() => getList())
|
||||
onMounted(() => {
|
||||
// 初始化时获取动态列,防止首次加载表格为空白列
|
||||
getColumns().then(res => {
|
||||
const d = res.data[0]
|
||||
allCols.feed = d.feed || []
|
||||
allCols.sale = d.sale || []
|
||||
selectedFeed.value = [...allCols.feed]
|
||||
selectedSale.value = [...allCols.sale]
|
||||
getList()
|
||||
})
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.app-container {
|
||||
padding: 20px;
|
||||
}
|
||||
.mb-4 {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
</style>
|
||||
@ -1,26 +1,23 @@
|
||||
<!-- index.vue (前端视图,仅保留单日查询功能) -->
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<el-form ref="queryRef" :model="queryParams" inline label-width="80px">
|
||||
<!-- 单日查询 -->
|
||||
<el-form-item label="查询日期">
|
||||
<el-form-item label="查询日期" style="width: 308px">
|
||||
<el-date-picker
|
||||
v-model="queryDate"
|
||||
type="date"
|
||||
placeholder="选择查询日期"
|
||||
v-model="dateRange"
|
||||
type="daterange"
|
||||
range-separator="-"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
value-format="YYYY-MM-DD"
|
||||
format="YYYY-MM-DD"
|
||||
clearable />
|
||||
</el-form-item>
|
||||
|
||||
<!-- 管理耳号输入框 -->
|
||||
<el-form-item label="管理耳号">
|
||||
<el-input v-model="queryParams.manageEarNo" placeholder="请输入管理耳号" clearable />
|
||||
</el-form-item>
|
||||
|
||||
<!-- 厂区下拉框 -->
|
||||
<el-form-item label="厂区">
|
||||
<el-select v-model="queryParams.factory" clearable placeholder="请选择">
|
||||
<el-select v-model="queryParams.factory" clearable placeholder="请选择" style="width: 180px">
|
||||
<el-option
|
||||
v-for="d in ranchOptions"
|
||||
:key="d.value"
|
||||
@ -29,42 +26,50 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 班次下拉框 -->
|
||||
<el-form-item label="班次">
|
||||
<el-select v-model="queryParams.classes" clearable placeholder="请选择">
|
||||
<el-select v-model="queryParams.classes" clearable placeholder="请选择" style="width: 120px">
|
||||
<el-option :value="1" label="1" />
|
||||
<el-option :value="2" label="2" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="getList">查询</el-button>
|
||||
<el-button type="primary" @click="handleQuery">查询</el-button>
|
||||
<el-button @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-row>
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button type="info" plain @click="handleImport" v-hasPermi="['milkProdclasses:milkProdclasses:import']">
|
||||
<el-icon><Upload /></el-icon> 导入
|
||||
</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="warning" plain @click="handleExport" v-hasPermi="['milkProdclasses:milkProdclasses:export']">
|
||||
<el-icon><Download /></el-icon> 导出
|
||||
</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-table :data="tableData" v-loading="loading">
|
||||
<el-table-column prop="datetime" label="日期" width="110" />
|
||||
<el-table-column prop="datetime" label="日期" width="110" sortable>
|
||||
<template #default="{ row }">
|
||||
{{ parseTime(row.datetime, '{y}-{m}-{d}') }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="manageEarNo" label="管理耳号" />
|
||||
<el-table-column prop="electronicEarNo" label="电子耳号" />
|
||||
<el-table-column prop="parity" label="胎次" />
|
||||
<el-table-column prop="parity" label="胎次" sortable />
|
||||
<el-table-column prop="factory" label="厂区" />
|
||||
<el-table-column prop="classes" label="班次" />
|
||||
<el-table-column prop="milk" label="班次产奶量" >
|
||||
<el-table-column prop="classes" label="班次" sortable />
|
||||
|
||||
<el-table-column prop="milk" label="班次产奶量" sortable>
|
||||
<template #default="{ row }">
|
||||
{{ row.milk ? Number(row.milk).toFixed(2) : '-' }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="correctedMilk" label="班次校正奶量" >
|
||||
<el-table-column prop="correctedMilk" label="班次校正奶量" sortable>
|
||||
<template #default="{ row }">
|
||||
{{ row.correctedMilk ? Number(row.correctedMilk).toFixed(2) : '-' }}
|
||||
</template>
|
||||
@ -74,9 +79,9 @@
|
||||
<pagination v-show="total>0" :total="total"
|
||||
v-model:page="queryParams.pageNum"
|
||||
v-model:limit="queryParams.pageSize"
|
||||
:page-sizes="[20, 50, 100, 200, 500, 1000, 2000]"
|
||||
@pagination="getList" />
|
||||
|
||||
<!-- 导入弹窗 -->
|
||||
<el-dialog title="Excel导入" v-model="openImport" width="400px">
|
||||
<el-upload drag :action="uploadUrl" :headers="headers"
|
||||
accept=".xls,.xlsx" :on-success="uploadSuccess" :on-error="uploadError">
|
||||
@ -88,13 +93,15 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
|
||||
import { listMilkProdclasses, importMilkProdclasses, exportMilkProdclasses } from '@/api/dairyProducts/milkProdclasses/milkProdclasses'
|
||||
import { getToken } from '@/utils/auth'
|
||||
import { getRanchList } from '@/api/dairyProducts/ranch/ranch.js'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { Upload, Download, UploadFilled } from '@element-plus/icons-vue';
|
||||
import { parseTime } from '@/utils/ruoyi'
|
||||
|
||||
const { proxy } = getCurrentInstance()
|
||||
const ranchOptions = ref([])
|
||||
|
||||
onMounted(() => {
|
||||
@ -110,14 +117,14 @@ onMounted(() => {
|
||||
|
||||
const queryParams = reactive({
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
pageSize: 20, // 默认20条
|
||||
datetimeStart: null, // 开始日期
|
||||
datetimeEnd: null, // 结束日期
|
||||
manageEarNo: '', // 管理耳号
|
||||
factory: null, // 厂区
|
||||
classes: null // 班次
|
||||
})
|
||||
const queryDate = ref(null) // 查询日期
|
||||
const dateRange = ref([]) // 新增:日期范围变量
|
||||
const tableData = ref([]) // 表格数据
|
||||
const total = ref(0) // 总数据条数
|
||||
const loading = ref(false) // 加载状态
|
||||
@ -129,24 +136,16 @@ const headers = { Authorization: 'Bearer ' + getToken() };
|
||||
function getList() {
|
||||
loading.value = true
|
||||
|
||||
// 设置查询参数
|
||||
if (queryDate.value) {
|
||||
queryParams.datetimeStart = queryDate.value;
|
||||
queryParams.datetimeEnd = queryDate.value;
|
||||
// 处理日期范围参数
|
||||
if (dateRange.value && dateRange.value.length === 2) {
|
||||
queryParams.datetimeStart = dateRange.value[0];
|
||||
queryParams.datetimeEnd = dateRange.value[1];
|
||||
} else {
|
||||
queryParams.datetimeStart = null;
|
||||
queryParams.datetimeEnd = null;
|
||||
}
|
||||
|
||||
listMilkProdclasses({
|
||||
datetimeStart: queryParams.datetimeStart,
|
||||
datetimeEnd: queryParams.datetimeEnd,
|
||||
manageEarNo: queryParams.manageEarNo,
|
||||
factory: queryParams.factory,
|
||||
classes: queryParams.classes,
|
||||
pageNum: queryParams.pageNum,
|
||||
pageSize: queryParams.pageSize
|
||||
}).then(res => {
|
||||
listMilkProdclasses(queryParams).then(res => {
|
||||
tableData.value = res.rows
|
||||
total.value = res.total
|
||||
loading.value = false
|
||||
@ -156,16 +155,20 @@ function getList() {
|
||||
});
|
||||
}
|
||||
|
||||
function handleQuery() {
|
||||
queryParams.pageNum = 1;
|
||||
getList();
|
||||
}
|
||||
|
||||
function resetQuery() {
|
||||
Object.assign(queryParams, {
|
||||
pageNum: 1,
|
||||
datetimeStart: null,
|
||||
datetimeEnd: null,
|
||||
manageEarNo: '',
|
||||
factory: null,
|
||||
classes: null
|
||||
});
|
||||
queryDate.value = null;
|
||||
dateRange.value = []; // 清空日期范围
|
||||
// 显式重置所有字段
|
||||
queryParams.datetimeStart = null;
|
||||
queryParams.datetimeEnd = null;
|
||||
queryParams.manageEarNo = '';
|
||||
queryParams.factory = null;
|
||||
queryParams.classes = null;
|
||||
queryParams.pageNum = 1;
|
||||
getList();
|
||||
}
|
||||
|
||||
@ -186,41 +189,30 @@ function uploadError(err) {
|
||||
}
|
||||
|
||||
function handleExport() {
|
||||
// 设置查询参数
|
||||
if (queryDate.value) {
|
||||
queryParams.datetimeStart = queryDate.value;
|
||||
queryParams.datetimeEnd = queryDate.value;
|
||||
// 导出时同样需要处理日期参数
|
||||
if (dateRange.value && dateRange.value.length === 2) {
|
||||
queryParams.datetimeStart = dateRange.value[0];
|
||||
queryParams.datetimeEnd = dateRange.value[1];
|
||||
} else {
|
||||
queryParams.datetimeStart = null;
|
||||
queryParams.datetimeEnd = null;
|
||||
}
|
||||
|
||||
exportMilkProdclasses({
|
||||
datetimeStart: queryParams.datetimeStart,
|
||||
datetimeEnd: queryParams.datetimeEnd,
|
||||
manageEarNo: queryParams.manageEarNo,
|
||||
factory: queryParams.factory,
|
||||
classes: queryParams.classes
|
||||
}).then(response => {
|
||||
// 创建Blob对象,用于文件下载
|
||||
exportMilkProdclasses(queryParams).then(response => {
|
||||
const blob = new Blob([response], {
|
||||
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
||||
});
|
||||
|
||||
// 创建下载链接
|
||||
const downloadElement = document.createElement('a');
|
||||
const href = window.URL.createObjectURL(blob);
|
||||
downloadElement.href = href;
|
||||
|
||||
// 设置下载文件名,包含当前日期
|
||||
const now = new Date();
|
||||
const dateStr = `${now.getFullYear()}${(now.getMonth()+1).toString().padStart(2, '0')}${now.getDate().toString().padStart(2, '0')}`;
|
||||
downloadElement.download = `班次产奶数据_${dateStr}.xlsx`;
|
||||
|
||||
document.body.appendChild(downloadElement);
|
||||
// 触发点击下载
|
||||
downloadElement.click();
|
||||
// 释放URL对象
|
||||
document.body.removeChild(downloadElement);
|
||||
window.URL.revokeObjectURL(href);
|
||||
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<!-- 搜索条件 只保留胎次 -->
|
||||
<el-form-item label="胎次" prop="parity">
|
||||
<el-input
|
||||
v-model="queryParams.parity"
|
||||
@ -46,15 +45,15 @@
|
||||
v-hasPermi="['parityCorrection:parityCorrection:remove']"
|
||||
>删除</el-button>
|
||||
</el-col>
|
||||
<!-- 去掉导出按钮 -->
|
||||
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="parityCorrectionList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<!-- 去掉 ${comment} -->
|
||||
<el-table-column label="胎次" align="center" prop="parity" />
|
||||
<el-table-column label="系数" align="center" prop="coef" />
|
||||
|
||||
<el-table-column label="胎次" align="center" prop="parity" sortable />
|
||||
<el-table-column label="系数" align="center" prop="coef" sortable />
|
||||
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template #default="scope">
|
||||
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['parityCorrection:parityCorrection:edit']">修改</el-button>
|
||||
@ -68,10 +67,10 @@
|
||||
:total="total"
|
||||
v-model:page="queryParams.pageNum"
|
||||
v-model:limit="queryParams.pageSize"
|
||||
:page-sizes="[20, 50, 100, 200, 500, 1000, 2000]"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
<!-- 添加或修改胎次校正对话框 -->
|
||||
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
|
||||
<el-form ref="parityCorrectionRef" :model="form" :rules="rules" label-width="80px">
|
||||
<el-form-item label="胎次" prop="parity">
|
||||
@ -92,7 +91,8 @@
|
||||
</template>
|
||||
|
||||
<script setup name="ParityCorrection">
|
||||
import { listParityCorrection, getParityCorrection, delParityCorrection, addParityCorrection, updateParityCorrection } from "@/api/dairyProducts/parityCorrection/parityCorrection"
|
||||
import { listParityCorrection, getParityCorrection, delParityCorrection, addParityCorrection, updateParityCorrection } from "@/api/dairyProducts/parityCorrection/parityCorrection.js"
|
||||
import { getCurrentInstance, ref, reactive, toRefs } from 'vue'
|
||||
|
||||
const { proxy } = getCurrentInstance()
|
||||
|
||||
@ -110,8 +110,8 @@ const data = reactive({
|
||||
form: {},
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
parity: null // ✅ 只保留胎次
|
||||
pageSize: 20, // 修改:默认20条
|
||||
parity: null
|
||||
},
|
||||
rules: {}
|
||||
})
|
||||
|
||||
@ -1,13 +1,15 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form-item label="检测日期" prop="datetime">
|
||||
<el-date-picker clearable
|
||||
v-model="queryParams.datetime"
|
||||
type="date"
|
||||
<el-form-item label="检测日期" style="width: 308px">
|
||||
<el-date-picker
|
||||
v-model="dateRange"
|
||||
value-format="YYYY-MM-DD"
|
||||
placeholder="请选择检测日期">
|
||||
</el-date-picker>
|
||||
type="daterange"
|
||||
range-separator="-"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
></el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="来源" prop="source">
|
||||
<el-input
|
||||
@ -75,32 +77,34 @@
|
||||
|
||||
<el-table v-loading="loading" :data="rawMilkTestList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="检测日期" align="center" prop="datetime" width="180" v-if="visibleColumns.datetime">
|
||||
<el-table-column label="检测日期" align="center" prop="datetime" width="180" v-if="visibleColumns.datetime" sortable>
|
||||
<template #default="scope">
|
||||
<span>{{ parseTime(scope.row.datetime, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="来源" align="center" prop="source" v-if="visibleColumns.source" />
|
||||
<el-table-column label="冰点" align="center" prop="freeze" v-if="visibleColumns.freeze" />
|
||||
<el-table-column label="相对密度" align="center" prop="density" v-if="visibleColumns.density" />
|
||||
<el-table-column label="脂肪g/100g" align="center" prop="fat" v-if="visibleColumns.fat" />
|
||||
<el-table-column label="蛋白质g/100g" align="center" prop="protein" v-if="visibleColumns.protein" />
|
||||
<el-table-column label="非脂g/100g" align="center" prop="nonFat" v-if="visibleColumns.nonFat" />
|
||||
<el-table-column label="干物质mg/100g" align="center" prop="dryMatter" v-if="visibleColumns.dryMatter" />
|
||||
<el-table-column label="杂质度mg/100g" align="center" prop="impurityDegree" v-if="visibleColumns.impurityDegree" />
|
||||
<el-table-column label="乳糖g/100g" align="center" prop="lactose" v-if="visibleColumns.lactose" />
|
||||
<el-table-column label="灰度g/100g" align="center" prop="ashContent" v-if="visibleColumns.ashContent" />
|
||||
<el-table-column label="酸度" align="center" prop="acidity" v-if="visibleColumns.acidity" />
|
||||
<el-table-column label="ph" align="center" prop="ph" v-if="visibleColumns.ph" />
|
||||
<el-table-column label="菌落总数" align="center" prop="bacterialColony" v-if="visibleColumns.bacterialColony" />
|
||||
<el-table-column label="乳铁蛋白" align="center" prop="lactoferrin" v-if="visibleColumns.lactoferrin" />
|
||||
<el-table-column label="免疫球蛋白" align="center" prop="ig" v-if="visibleColumns.ig" />
|
||||
<el-table-column label="体细胞" align="center" prop="somaticCell" v-if="visibleColumns.somaticCell" />
|
||||
<el-table-column label="尿素氮" align="center" prop="usea" v-if="visibleColumns.usea" />
|
||||
<el-table-column label="脂蛋比" align="center" prop="fatRatio" v-if="visibleColumns.fatRatio" />
|
||||
|
||||
<el-table-column label="冰点" align="center" prop="freeze" v-if="visibleColumns.freeze" sortable />
|
||||
<el-table-column label="相对密度" align="center" prop="density" v-if="visibleColumns.density" sortable />
|
||||
<el-table-column label="脂肪g/100g" align="center" prop="fat" v-if="visibleColumns.fat" sortable />
|
||||
<el-table-column label="蛋白质g/100g" align="center" prop="protein" v-if="visibleColumns.protein" sortable />
|
||||
<el-table-column label="非脂g/100g" align="center" prop="nonFat" v-if="visibleColumns.nonFat" sortable />
|
||||
<el-table-column label="干物质mg/100g" align="center" prop="dryMatter" v-if="visibleColumns.dryMatter" sortable />
|
||||
<el-table-column label="杂质度mg/100g" align="center" prop="impurityDegree" v-if="visibleColumns.impurityDegree" sortable />
|
||||
<el-table-column label="乳糖g/100g" align="center" prop="lactose" v-if="visibleColumns.lactose" sortable />
|
||||
<el-table-column label="灰度g/100g" align="center" prop="ashContent" v-if="visibleColumns.ashContent" sortable />
|
||||
<el-table-column label="酸度" align="center" prop="acidity" v-if="visibleColumns.acidity" sortable />
|
||||
<el-table-column label="ph" align="center" prop="ph" v-if="visibleColumns.ph" sortable />
|
||||
<el-table-column label="菌落总数" align="center" prop="bacterialColony" v-if="visibleColumns.bacterialColony" sortable />
|
||||
<el-table-column label="乳铁蛋白" align="center" prop="lactoferrin" v-if="visibleColumns.lactoferrin" sortable />
|
||||
<el-table-column label="免疫球蛋白" align="center" prop="ig" v-if="visibleColumns.ig" sortable />
|
||||
<el-table-column label="体细胞" align="center" prop="somaticCell" v-if="visibleColumns.somaticCell" sortable />
|
||||
<el-table-column label="尿素氮" align="center" prop="usea" v-if="visibleColumns.usea" sortable />
|
||||
<el-table-column label="脂蛋比" align="center" prop="fatRatio" v-if="visibleColumns.fatRatio" sortable />
|
||||
|
||||
<el-table-column label="备注" align="center" prop="comment" v-if="visibleColumns.comment" />
|
||||
<el-table-column label="创建人" align="center" prop="createBy" v-if="visibleColumns.createBy" />
|
||||
<el-table-column label="创建时间" align="center" prop="createTime" width="180" v-if="visibleColumns.createTime">
|
||||
<el-table-column label="创建时间" align="center" prop="createTime" width="180" v-if="visibleColumns.createTime" sortable>
|
||||
<template #default="scope">
|
||||
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
|
||||
</template>
|
||||
@ -118,10 +122,10 @@
|
||||
:total="total"
|
||||
v-model:page="queryParams.pageNum"
|
||||
v-model:limit="queryParams.pageSize"
|
||||
:page-sizes="[20, 50, 100, 200, 500, 1000, 2000]"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
<!-- 添加或修改生乳检验记录对话框 -->
|
||||
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
|
||||
<el-form ref="rawMilkTestRef" :model="form" :rules="rules" label-width="120px">
|
||||
<el-form-item label="检测日期" prop="datetime">
|
||||
@ -216,7 +220,6 @@
|
||||
</template>
|
||||
</el-dialog>
|
||||
|
||||
<!-- 字段选择对话框 -->
|
||||
<el-dialog title="字段显示设置" v-model="showColumnSelector" width="600px" append-to-body>
|
||||
<el-checkbox-group v-model="selectedColumns">
|
||||
<el-row>
|
||||
@ -236,9 +239,7 @@
|
||||
</template>
|
||||
|
||||
<script setup name="RawMilkTest">
|
||||
// 导入xlsx库
|
||||
import * as XLSX from 'xlsx';
|
||||
// 导入file-saver用于文件下载
|
||||
import { saveAs } from 'file-saver';
|
||||
import { listRawMilkTest, getRawMilkTest, delRawMilkTest, addRawMilkTest, updateRawMilkTest } from "@/api/dairyProducts/rawMilkTest/rawMilkTest.js"
|
||||
import { getCurrentInstance, ref, reactive, toRefs, onMounted } from 'vue'
|
||||
@ -246,7 +247,6 @@ import { parseTime } from '@/utils/ruoyi'
|
||||
|
||||
const { proxy } = getCurrentInstance()
|
||||
|
||||
// 获取当前用户名
|
||||
const getCurrentUsername = () => {
|
||||
const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
|
||||
return userInfo.userName || userInfo.username || userInfo.nickName || 'admin'
|
||||
@ -262,8 +262,8 @@ const multiple = ref(true)
|
||||
const total = ref(0)
|
||||
const title = ref("")
|
||||
const showColumnSelector = ref(false)
|
||||
const dateRange = ref([]) // 新增:日期范围变量
|
||||
|
||||
// 所有可选的列配置
|
||||
const allColumns = ref([
|
||||
{ prop: 'datetime', label: '检测日期' },
|
||||
{ prop: 'source', label: '来源' },
|
||||
@ -289,7 +289,6 @@ const allColumns = ref([
|
||||
{ prop: 'createTime', label: '创建时间' }
|
||||
])
|
||||
|
||||
// 默认选中的列
|
||||
const selectedColumns = ref([
|
||||
'datetime', 'source', 'freeze', 'density', 'fat', 'protein', 'nonFat',
|
||||
'dryMatter', 'impurityDegree', 'lactose', 'ashContent', 'acidity', 'ph',
|
||||
@ -297,10 +296,8 @@ const selectedColumns = ref([
|
||||
'comment', 'createBy', 'createTime'
|
||||
])
|
||||
|
||||
// 当前显示的列
|
||||
const visibleColumns = ref({})
|
||||
|
||||
// 初始化列显示状态
|
||||
const initVisibleColumns = () => {
|
||||
allColumns.value.forEach(column => {
|
||||
visibleColumns.value[column.prop] = selectedColumns.value.includes(column.prop)
|
||||
@ -311,9 +308,9 @@ const data = reactive({
|
||||
form: {},
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
datetime: null,
|
||||
pageSize: 20, // 修改:默认20条
|
||||
source: null
|
||||
// datetime 已移除,使用 dateRange
|
||||
},
|
||||
rules: {
|
||||
datetime: [
|
||||
@ -321,27 +318,24 @@ const data = reactive({
|
||||
],
|
||||
source: [
|
||||
{ required: true, message: "来源不能为空", trigger: "blur" }
|
||||
],
|
||||
// 其他字段根据需要添加验证规则
|
||||
]
|
||||
}
|
||||
})
|
||||
|
||||
const { queryParams, form, rules } = toRefs(data)
|
||||
|
||||
// 应用列选择
|
||||
const applyColumnSelection = () => {
|
||||
initVisibleColumns()
|
||||
showColumnSelector.value = false
|
||||
}
|
||||
|
||||
// 脂蛋比计算方法
|
||||
const calculateFatRatio = () => {
|
||||
try {
|
||||
const fat = parseFloat(form.value.fat)
|
||||
const protein = parseFloat(form.value.protein)
|
||||
|
||||
if (!isNaN(fat) && !isNaN(protein) && protein !== 0) {
|
||||
form.value.fatRatio = (fat / protein).toFixed(4) // 保留4位小数
|
||||
form.value.fatRatio = (fat / protein).toFixed(4)
|
||||
} else {
|
||||
form.value.fatRatio = ""
|
||||
}
|
||||
@ -353,6 +347,8 @@ const calculateFatRatio = () => {
|
||||
/** 查询生乳检验记录列表 */
|
||||
function getList() {
|
||||
loading.value = true
|
||||
// 处理日期范围
|
||||
proxy.addDateRange(queryParams.value, dateRange.value)
|
||||
listRawMilkTest(queryParams.value).then(response => {
|
||||
rawMilkTestList.value = response.rows
|
||||
total.value = response.total
|
||||
@ -362,13 +358,11 @@ function getList() {
|
||||
})
|
||||
}
|
||||
|
||||
// 取消按钮
|
||||
function cancel() {
|
||||
open.value = false
|
||||
reset()
|
||||
}
|
||||
|
||||
// 表单重置
|
||||
function reset() {
|
||||
form.value = {
|
||||
id: null,
|
||||
@ -404,11 +398,11 @@ function handleQuery() {
|
||||
|
||||
/** 重置按钮操作 */
|
||||
function resetQuery() {
|
||||
dateRange.value = [] // 重置日期范围
|
||||
proxy.resetForm("queryRef")
|
||||
handleQuery()
|
||||
}
|
||||
|
||||
// 多选框选中数据
|
||||
function handleSelectionChange(selection) {
|
||||
ids.value = selection.map(item => item.id)
|
||||
single.value = selection.length != 1
|
||||
@ -420,8 +414,6 @@ function handleAdd() {
|
||||
reset()
|
||||
open.value = true
|
||||
title.value = "添加生乳检验记录"
|
||||
|
||||
// 设置创建人和创建时间(格式化为YYYY-MM-DD HH:mm:ss)
|
||||
form.value.createBy = getCurrentUsername()
|
||||
form.value.createTime = new Date().toLocaleString('zh-CN', {
|
||||
year: 'numeric',
|
||||
@ -431,8 +423,6 @@ function handleAdd() {
|
||||
minute: '2-digit',
|
||||
second: '2-digit'
|
||||
}).replace(/\//g, '-')
|
||||
|
||||
// 初始化脂蛋比
|
||||
form.value.fatRatio = ""
|
||||
}
|
||||
|
||||
@ -442,7 +432,6 @@ function handleUpdate(row) {
|
||||
const _id = row.id || ids.value
|
||||
getRawMilkTest(_id).then(response => {
|
||||
form.value = response.data
|
||||
// 计算脂蛋比
|
||||
calculateFatRatio()
|
||||
open.value = true
|
||||
title.value = "修改生乳检验记录"
|
||||
@ -455,7 +444,6 @@ function handleUpdate(row) {
|
||||
function submitForm() {
|
||||
proxy.$refs["rawMilkTestRef"].validate(valid => {
|
||||
if (valid) {
|
||||
// 新增时设置创建信息
|
||||
if (form.value.id == null) {
|
||||
form.value.createBy = getCurrentUsername()
|
||||
form.value.createTime = new Date().toLocaleString('zh-CN', {
|
||||
@ -500,16 +488,13 @@ function handleDelete(row) {
|
||||
|
||||
/** 导出按钮操作 */
|
||||
function handleExport() {
|
||||
// 获取当前显示的列配置
|
||||
const visibleColumnsConfig = allColumns.value.filter(
|
||||
col => visibleColumns.value[col.prop]
|
||||
);
|
||||
|
||||
// 准备导出数据
|
||||
const exportData = rawMilkTestList.value.map(item => {
|
||||
const rowData = {};
|
||||
visibleColumnsConfig.forEach(col => {
|
||||
// 特殊处理日期字段
|
||||
if (col.prop === 'datetime' || col.prop === 'createTime') {
|
||||
rowData[col.label] = parseTime(item[col.prop]);
|
||||
} else {
|
||||
@ -519,18 +504,15 @@ function handleExport() {
|
||||
return rowData;
|
||||
});
|
||||
|
||||
// 创建工作簿和工作表
|
||||
const worksheet = XLSX.utils.json_to_sheet(exportData);
|
||||
const workbook = XLSX.utils.book_new();
|
||||
XLSX.utils.book_append_sheet(workbook, worksheet, '生乳检验记录');
|
||||
|
||||
// 生成Excel文件并下载
|
||||
const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
|
||||
const blob = new Blob([excelBuffer], {
|
||||
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
||||
});
|
||||
|
||||
// 使用file-saver保存文件
|
||||
saveAs(blob, `生乳检验记录_${new Date().getTime()}.xlsx`);
|
||||
}
|
||||
|
||||
|
||||
@ -1,9 +1,8 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<!-- 查询条件 -->
|
||||
<el-form :inline="true" :model="queryParams" class="filter-form">
|
||||
<el-form-item label="耳号">
|
||||
<el-input v-model="queryParams.manageEarTag" placeholder="请输入耳号" />
|
||||
<el-input v-model="queryParams.manageEarTag" placeholder="请输入耳号" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="筛选天数">
|
||||
<el-input-number v-model="queryParams.screenDays" :min="1" placeholder="请输入天数" />
|
||||
@ -14,21 +13,18 @@
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<!-- 操作按钮行 -->
|
||||
<div class="button-group">
|
||||
<el-popover placement="bottom" width="400" trigger="click">
|
||||
<el-checkbox-group v-model="selectedFields" class="checkbox-columns">
|
||||
<!-- 使用 :value 替代 :label -->
|
||||
<el-checkbox v-for="col in allColumns" :key="col.prop" :value="col.prop">{{ col.label }}</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
<template #reference>
|
||||
<el-button type="info">展示列</el-button>
|
||||
<el-button type="info" icon="Menu">展示列</el-button>
|
||||
</template>
|
||||
</el-popover>
|
||||
<el-button type="success" @click="handleExport">导出</el-button>
|
||||
<el-button type="success" icon="Download" @click="handleExport">导出</el-button>
|
||||
</div>
|
||||
|
||||
<!-- 数据表格 -->
|
||||
<el-table :data="list" border style="width: 100%" v-loading="loading" :row-key="row => row.sheepId">
|
||||
<el-table-column
|
||||
v-for="col in visibleColumns"
|
||||
@ -36,11 +32,11 @@
|
||||
:label="col.label"
|
||||
:prop="col.prop"
|
||||
:min-width="col.minWidth || 120"
|
||||
:sortable="col.sortable || false"
|
||||
:formatter="col.formatter || undefined"
|
||||
/>
|
||||
</el-table>
|
||||
|
||||
<!-- 分页 -->
|
||||
<el-pagination
|
||||
v-show="total > 0"
|
||||
:total="total"
|
||||
@ -49,7 +45,7 @@
|
||||
@current-change="handlePageChange"
|
||||
@size-change="handleSizeChange"
|
||||
layout="total, sizes, prev, pager, next, jumper"
|
||||
:page-sizes="[10, 20, 50, 100]"
|
||||
:page-sizes="[20, 50, 100, 200, 500, 1000, 2000]"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
@ -68,49 +64,50 @@ export default {
|
||||
list: [],
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
pageSize: 20, // 修改默认每页条数
|
||||
manageEarTag: null,
|
||||
screenDays: 100 // 默认筛选天数
|
||||
},
|
||||
selectedFields: [],
|
||||
// 修改:为数字字段添加 sortable: true
|
||||
allColumns: [
|
||||
{ label: "耳号", prop: "manageEarTag" },
|
||||
{ label: "品种", prop: "variety" },
|
||||
{ label: "挤奶开始时间", prop: "milkingStartTime", formatter: row => row.milkingStartTime ? format(new Date(row.milkingStartTime),'yyyy-MM-dd') : '' },
|
||||
{ label: "干奶时间", prop: "dryEndTime", formatter: row => row.dryEndTime ? format(new Date(row.dryEndTime),'yyyy-MM-dd') : '' },
|
||||
{ label: "筛选天数", prop: "screenDays" },
|
||||
{ label: "挤奶天数", prop: "milkingDays" },
|
||||
{ label: "校正后最大胎次", prop: "maxParity" },
|
||||
{ label: "系统奶量之合计", prop: "sumSystemMilk" },
|
||||
{ label: "校正奶量之合计", prop: "sumCorrectedMilk" },
|
||||
{ label: "校正日平均奶量", prop: "avgCorrectedDaily" },
|
||||
{ label: "胎次1的总奶量", prop: "sumParity1Milk" },
|
||||
{ label: "胎次2的总奶量", prop: "sumParity2Milk" },
|
||||
{ label: "胎次3的总奶量", prop: "sumParity3Milk" },
|
||||
{ label: "胎次4的总奶量", prop: "sumParity4Milk" },
|
||||
{ label: "胎次1日平均", prop: "avgParity1Daily" },
|
||||
{ label: "胎次2日平均", prop: "avgParity2Daily" },
|
||||
{ label: "胎次3日平均", prop: "avgParity3Daily" },
|
||||
{ label: "胎次4日平均", prop: "avgParity4Daily" },
|
||||
{ label: "泌乳天数", prop: "lactationDays" },
|
||||
{ label: "过去7日均奶量", prop: "avgLast7Milk" },
|
||||
{ label: "校正过去7日均", prop: "avgLast7Corrected" },
|
||||
{ label: "过去14日均奶量", prop: "avgLast14Milk" },
|
||||
{ label: "过去30日均奶量", prop: "avgLast30Milk" },
|
||||
{ label: "筛选天数", prop: "screenDays", sortable: true },
|
||||
{ label: "挤奶天数", prop: "milkingDays", sortable: true },
|
||||
{ label: "校正后最大胎次", prop: "maxParity", sortable: true },
|
||||
{ label: "系统奶量之合计", prop: "sumSystemMilk", sortable: true },
|
||||
{ label: "校正奶量之合计", prop: "sumCorrectedMilk", sortable: true },
|
||||
{ label: "校正日平均奶量", prop: "avgCorrectedDaily", sortable: true },
|
||||
{ label: "胎次1的总奶量", prop: "sumParity1Milk", sortable: true },
|
||||
{ label: "胎次2的总奶量", prop: "sumParity2Milk", sortable: true },
|
||||
{ label: "胎次3的总奶量", prop: "sumParity3Milk", sortable: true },
|
||||
{ label: "胎次4的总奶量", prop: "sumParity4Milk", sortable: true },
|
||||
{ label: "胎次1日平均", prop: "avgParity1Daily", sortable: true },
|
||||
{ label: "胎次2日平均", prop: "avgParity2Daily", sortable: true },
|
||||
{ label: "胎次3日平均", prop: "avgParity3Daily", sortable: true },
|
||||
{ label: "胎次4日平均", prop: "avgParity4Daily", sortable: true },
|
||||
{ label: "泌乳天数", prop: "lactationDays", sortable: true },
|
||||
{ label: "过去7日均奶量", prop: "avgLast7Milk", sortable: true },
|
||||
{ label: "校正过去7日均", prop: "avgLast7Corrected", sortable: true },
|
||||
{ label: "过去14日均奶量", prop: "avgLast14Milk", sortable: true },
|
||||
{ label: "过去30日均奶量", prop: "avgLast30Milk", sortable: true },
|
||||
{ label: "羊只类别", prop: "sheepCategory" },
|
||||
{ label: "生日", prop: "birthday", formatter: row => row.birthday ? format(new Date(row.birthday),'yyyy-MM-dd') : '' },
|
||||
{ label: "当前胎次", prop: "parity" },
|
||||
{ label: "月龄", prop: "monthAge" },
|
||||
{ label: "当前体重", prop: "currentWeight" },
|
||||
{ label: "当前胎次", prop: "parity", sortable: true },
|
||||
{ label: "月龄", prop: "monthAge", sortable: true },
|
||||
{ label: "当前体重", prop: "currentWeight", sortable: true },
|
||||
{ label: "繁育状态", prop: "breedStatus" },
|
||||
{ label: "父号", prop: "fatherManageTags" },
|
||||
{ label: "母号", prop: "motherManageTags" },
|
||||
{ label: "牧场", prop: "ranchName" },
|
||||
{ label: "家系", prop: "family" },
|
||||
{ label: "母亲挤奶天数", prop: "motherMilkingDays" },
|
||||
{ label: "母亲校正奶量之合计", prop: "motherSumCorrected" },
|
||||
{ label: "母亲校正后最大胎次", prop: "motherMaxParity" },
|
||||
{ label: "母亲校正日平均奶量", prop: "motherAvgCorrectedDaily" }
|
||||
{ label: "母亲挤奶天数", prop: "motherMilkingDays", sortable: true },
|
||||
{ label: "母亲校正奶量之合计", prop: "motherSumCorrected", sortable: true },
|
||||
{ label: "母亲校正后最大胎次", prop: "motherMaxParity", sortable: true },
|
||||
{ label: "母亲校正日平均奶量", prop: "motherAvgCorrectedDaily", sortable: true }
|
||||
]
|
||||
};
|
||||
},
|
||||
@ -120,6 +117,7 @@ export default {
|
||||
},
|
||||
computed: {
|
||||
visibleColumns() {
|
||||
// 保持原有顺序
|
||||
return this.allColumns.filter(col => this.selectedFields.includes(col.prop));
|
||||
}
|
||||
},
|
||||
@ -140,7 +138,7 @@ export default {
|
||||
resetQuery() {
|
||||
this.queryParams = {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
pageSize: 20,
|
||||
manageEarTag: null,
|
||||
screenDays: 100
|
||||
};
|
||||
|
||||
@ -1,16 +1,18 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form-item label="日期" prop="datetime">
|
||||
<el-date-picker clearable
|
||||
v-model="queryParams.datetime"
|
||||
type="date"
|
||||
<el-form-item label="日期" style="width: 308px">
|
||||
<el-date-picker
|
||||
v-model="dateRange"
|
||||
value-format="YYYY-MM-DD"
|
||||
placeholder="请选择日期">
|
||||
</el-date-picker>
|
||||
type="daterange"
|
||||
range-separator="-"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
></el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="厂区" prop="factory">
|
||||
<el-select v-model="queryParams.factory" placeholder="请选择厂区" clearable>
|
||||
<el-select v-model="queryParams.factory" placeholder="请选择厂区" clearable style="width: 240px">
|
||||
<el-option
|
||||
v-for="dict in da_ranch"
|
||||
:key="dict.value"
|
||||
@ -69,7 +71,7 @@
|
||||
|
||||
<el-table v-loading="loading" :data="weightCorrectionList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="日期" align="center" prop="datetime" width="180">
|
||||
<el-table-column label="日期" align="center" prop="datetime" width="180" sortable>
|
||||
<template #default="scope">
|
||||
<span>{{ parseTime(scope.row.datetime, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
@ -79,11 +81,11 @@
|
||||
<dict-tag :options="da_ranch" :value="scope.row.factory"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="实际奶量" align="center" prop="actual" />
|
||||
<el-table-column label="系统奶量" align="center" prop="systemMilk" /> <!-- 修改这里 -->
|
||||
<el-table-column label="称重系数" align="center" prop="coefficient">
|
||||
<el-table-column label="实际奶量" align="center" prop="actual" sortable />
|
||||
<el-table-column label="系统奶量" align="center" prop="systemMilk" sortable />
|
||||
<el-table-column label="称重系数" align="center" prop="coefficient" sortable>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.coefficient.toFixed(2) }}</span>
|
||||
<span>{{ scope.row.coefficient ? scope.row.coefficient.toFixed(2) : '' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
@ -99,10 +101,10 @@
|
||||
:total="total"
|
||||
v-model:page="queryParams.pageNum"
|
||||
v-model:limit="queryParams.pageSize"
|
||||
:page-sizes="[20, 50, 100, 200, 500, 1000, 2000]"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
<!-- 添加或修改称重校正对话框 -->
|
||||
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
|
||||
<el-form ref="weightCorrectionRef" :model="form" :rules="rules" label-width="80px">
|
||||
<el-form-item label="日期" prop="datetime">
|
||||
@ -114,7 +116,7 @@
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="厂区" prop="factory">
|
||||
<el-select v-model="form.factory" placeholder="请选择厂区">
|
||||
<el-select v-model="form.factory" placeholder="请选择厂区" style="width: 100%">
|
||||
<el-option
|
||||
v-for="dict in da_ranch"
|
||||
:key="dict.value"
|
||||
@ -126,7 +128,7 @@
|
||||
<el-form-item label="实际奶量" prop="actual">
|
||||
<el-input v-model="form.actual" placeholder="请输入实际奶量" type="number" step="0.01" min="0" />
|
||||
</el-form-item>
|
||||
<el-form-item label="系统奶量" prop="systemMilk"> <!-- 修改这里 -->
|
||||
<el-form-item label="系统奶量" prop="systemMilk">
|
||||
<el-input v-model="form.systemMilk" placeholder="请输入系统奶量" type="number" step="0.01" min="0" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
@ -142,6 +144,7 @@
|
||||
|
||||
<script setup name="WeightCorrection">
|
||||
import { listWeightCorrection, getWeightCorrection, delWeightCorrection, addWeightCorrection, updateWeightCorrection } from "@/api/dairyProducts/weightCorrection/weightCorrection.js"
|
||||
import { getCurrentInstance, ref, reactive } from 'vue'
|
||||
|
||||
const { proxy } = getCurrentInstance()
|
||||
const { da_ranch } = proxy.useDict('da_ranch')
|
||||
@ -155,35 +158,42 @@ const single = ref(true)
|
||||
const multiple = ref(true)
|
||||
const total = ref(0)
|
||||
const title = ref("")
|
||||
const dateRange = ref([]) // 新增:日期范围变量
|
||||
|
||||
const data = reactive({
|
||||
form: {},
|
||||
queryParams: {
|
||||
// 修复:直接使用 reactive 定义 queryParams,解决下拉框回显问题
|
||||
const queryParams = reactive({
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
datetime: null,
|
||||
pageSize: 20, // 默认20条
|
||||
factory: null
|
||||
},
|
||||
rules: {
|
||||
})
|
||||
|
||||
const form = ref({
|
||||
id: null,
|
||||
datetime: null,
|
||||
factory: null,
|
||||
actual: null,
|
||||
systemMilk: null
|
||||
})
|
||||
|
||||
const rules = {
|
||||
datetime: [{ required: true, message: "日期不能为空", trigger: "blur" }],
|
||||
factory: [{ required: true, message: "厂区不能为空", trigger: "change" }],
|
||||
actual: [
|
||||
{ required: true, message: "实际奶量不能为空", trigger: "blur" },
|
||||
{ type: 'number', min: 0, message: "实际奶量必须大于0", trigger: "blur", transform: value => Number(value) }
|
||||
],
|
||||
systemMilk: [ // 修改这里
|
||||
systemMilk: [
|
||||
{ required: true, message: "系统奶量不能为空", trigger: "blur" },
|
||||
{ type: 'number', min: 0, message: "系统奶量必须大于0", trigger: "blur", transform: value => Number(value) }
|
||||
]
|
||||
}
|
||||
})
|
||||
|
||||
const { queryParams, form, rules } = toRefs(data)
|
||||
|
||||
/** 查询称重校正列表 */
|
||||
function getList() {
|
||||
loading.value = true
|
||||
listWeightCorrection(queryParams.value).then(response => {
|
||||
// 处理日期范围
|
||||
proxy.addDateRange(queryParams, dateRange.value)
|
||||
listWeightCorrection(queryParams).then(response => {
|
||||
weightCorrectionList.value = response.rows
|
||||
total.value = response.total
|
||||
loading.value = false
|
||||
@ -203,19 +213,21 @@ function reset() {
|
||||
datetime: null,
|
||||
factory: null,
|
||||
actual: null,
|
||||
systemMilk: null // 修改这里
|
||||
systemMilk: null
|
||||
}
|
||||
proxy.resetForm("weightCorrectionRef")
|
||||
}
|
||||
|
||||
/** 搜索按钮操作 */
|
||||
function handleQuery() {
|
||||
queryParams.value.pageNum = 1
|
||||
queryParams.pageNum = 1
|
||||
getList()
|
||||
}
|
||||
|
||||
/** 重置按钮操作 */
|
||||
function resetQuery() {
|
||||
dateRange.value = [] // 清空日期范围
|
||||
queryParams.factory = null // 显式重置下拉框绑定值
|
||||
proxy.resetForm("queryRef")
|
||||
handleQuery()
|
||||
}
|
||||
@ -253,25 +265,15 @@ function submitForm() {
|
||||
form.value.actual = parseFloat(form.value.actual)
|
||||
form.value.systemMilk = parseFloat(form.value.systemMilk)
|
||||
|
||||
if (form.value.id != null) {
|
||||
updateWeightCorrection(form.value).then(response => {
|
||||
proxy.$modal.msgSuccess("修改成功")
|
||||
const req = form.value.id ? updateWeightCorrection(form.value) : addWeightCorrection(form.value);
|
||||
|
||||
req.then(response => {
|
||||
proxy.$modal.msgSuccess(form.value.id ? "修改成功" : "新增成功")
|
||||
open.value = false
|
||||
getList()
|
||||
}).catch(error => {
|
||||
// 捕获后端返回的错误信息并显示
|
||||
proxy.$modal.msgError(error.response.data.msg || "修改失败")
|
||||
proxy.$modal.msgError(error.response ? error.response.data.msg : "操作失败")
|
||||
})
|
||||
} else {
|
||||
addWeightCorrection(form.value).then(response => {
|
||||
proxy.$modal.msgSuccess("新增成功")
|
||||
open.value = false
|
||||
getList()
|
||||
}).catch(error => {
|
||||
// 捕获后端返回的错误信息并显示
|
||||
proxy.$modal.msgError(error.response.data.msg || "新增失败")
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -290,9 +292,36 @@ function handleDelete(row) {
|
||||
/** 导出按钮操作 */
|
||||
function handleExport() {
|
||||
proxy.download('weightCorrection/weightCorrection/export', {
|
||||
...queryParams.value
|
||||
...queryParams
|
||||
}, `weightCorrection_${new Date().getTime()}.xlsx`)
|
||||
}
|
||||
|
||||
getList()
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.el-table {
|
||||
font-size: 14px;
|
||||
}
|
||||
.el-table th {
|
||||
background-color: #f5f7fa;
|
||||
color: #606266;
|
||||
font-weight: bold;
|
||||
}
|
||||
.el-table td, .el-table th {
|
||||
padding: 12px 0;
|
||||
}
|
||||
.el-table .cell {
|
||||
padding: 0 15px;
|
||||
}
|
||||
.el-button + .el-button {
|
||||
margin-left: 5px;
|
||||
}
|
||||
/* 确保表单元素宽度一致 */
|
||||
.el-input, .el-select {
|
||||
width: 100%;
|
||||
}
|
||||
.el-form-item {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
</style>
|
||||
@ -9,13 +9,15 @@
|
||||
@keyup.enter="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="检测日期" prop="datetime">
|
||||
<el-date-picker clearable
|
||||
v-model="queryParams.datetime"
|
||||
type="date"
|
||||
<el-form-item label="检测日期" style="width: 308px">
|
||||
<el-date-picker
|
||||
v-model="dateRange"
|
||||
value-format="YYYY-MM-DD"
|
||||
placeholder="请选择检测日期">
|
||||
</el-date-picker>
|
||||
type="daterange"
|
||||
range-separator="-"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
></el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
||||
@ -85,71 +87,86 @@
|
||||
align="center"
|
||||
prop="datetime"
|
||||
width="180"
|
||||
v-if="selectedColumns.includes('datetime')">
|
||||
v-if="selectedColumns.includes('datetime')"
|
||||
sortable>
|
||||
<template #default="scope">
|
||||
<span>{{ formatDate(scope.row.datetime) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column
|
||||
label="脂肪g/100g"
|
||||
align="center"
|
||||
prop="fat"
|
||||
v-if="selectedColumns.includes('fat')" />
|
||||
v-if="selectedColumns.includes('fat')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="蛋白质g/100g"
|
||||
align="center"
|
||||
prop="protein"
|
||||
v-if="selectedColumns.includes('protein')" />
|
||||
v-if="selectedColumns.includes('protein')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="非脂g/100g"
|
||||
align="center"
|
||||
prop="nonFat"
|
||||
v-if="selectedColumns.includes('nonFat')" />
|
||||
v-if="selectedColumns.includes('nonFat')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="酸度oT"
|
||||
align="center"
|
||||
prop="acidity"
|
||||
v-if="selectedColumns.includes('acidity')" />
|
||||
v-if="selectedColumns.includes('acidity')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="菌落总数1"
|
||||
align="center"
|
||||
prop="bacterialColony1"
|
||||
v-if="selectedColumns.includes('bacterialColony1')" />
|
||||
v-if="selectedColumns.includes('bacterialColony1')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="菌落总数2"
|
||||
align="center"
|
||||
prop="bacterialClony2"
|
||||
v-if="selectedColumns.includes('bacterialClony2')" />
|
||||
v-if="selectedColumns.includes('bacterialClony2')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="菌落总数3"
|
||||
align="center"
|
||||
prop="bacterialClony3"
|
||||
v-if="selectedColumns.includes('bacterialClony3')" />
|
||||
v-if="selectedColumns.includes('bacterialClony3')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="菌落总数4"
|
||||
align="center"
|
||||
prop="bacterialClony4"
|
||||
v-if="selectedColumns.includes('bacterialClony4')" />
|
||||
v-if="selectedColumns.includes('bacterialClony4')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="菌落总数5"
|
||||
align="center"
|
||||
prop="bacterialClony5"
|
||||
v-if="selectedColumns.includes('bacterialClony5')" />
|
||||
v-if="selectedColumns.includes('bacterialClony5')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="酵母菌(CFU/g)"
|
||||
align="center"
|
||||
prop="yeast"
|
||||
v-if="selectedColumns.includes('yeast')" />
|
||||
v-if="selectedColumns.includes('yeast')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="霉菌(CFU/g)"
|
||||
align="center"
|
||||
prop="mould"
|
||||
v-if="selectedColumns.includes('mould')" />
|
||||
v-if="selectedColumns.includes('mould')"
|
||||
sortable />
|
||||
<el-table-column
|
||||
label="乳酸菌(CFU/g)"
|
||||
align="center"
|
||||
prop="lacto"
|
||||
v-if="selectedColumns.includes('lacto')" />
|
||||
v-if="selectedColumns.includes('lacto')"
|
||||
sortable />
|
||||
|
||||
<el-table-column
|
||||
label="备注"
|
||||
align="center"
|
||||
@ -165,7 +182,8 @@
|
||||
align="center"
|
||||
prop="createTime"
|
||||
width="180"
|
||||
v-if="selectedColumns.includes('createTime')">
|
||||
v-if="selectedColumns.includes('createTime')"
|
||||
sortable>
|
||||
<template #default="scope">
|
||||
<span>{{ formatDateTime(scope.row.createTime) }}</span>
|
||||
</template>
|
||||
@ -183,6 +201,7 @@
|
||||
:total="total"
|
||||
v-model:page="queryParams.pageNum"
|
||||
v-model:limit="queryParams.pageSize"
|
||||
:page-sizes="[20, 50, 100, 200, 500, 1000, 2000]"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
@ -284,13 +303,14 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, onMounted } from 'vue';
|
||||
import { ref, reactive, onMounted, getCurrentInstance } from 'vue';
|
||||
import { listYogurtTest, getYogurtTest, delYogurtTest, addYogurtTest, updateYogurtTest } from "@/api/dairyProducts/yogurtTest/yogurtTest.js";
|
||||
import { ElMessage, ElMessageBox } from 'element-plus';
|
||||
// 导入xlsx库和file-saver
|
||||
import * as XLSX from 'xlsx';
|
||||
import { saveAs } from 'file-saver';
|
||||
|
||||
const { proxy } = getCurrentInstance(); // 获取 proxy 用于处理日期范围
|
||||
|
||||
// 响应式数据
|
||||
const yogurtTestList = ref([]);
|
||||
const open = ref(false);
|
||||
@ -303,6 +323,7 @@ const total = ref(0);
|
||||
const title = ref("");
|
||||
const columnShowDialogVisible = ref(false);
|
||||
const yogurtTestRef = ref(null);
|
||||
const dateRange = ref([]); // 新增:日期范围
|
||||
|
||||
// 列配置映射
|
||||
const columnConfig = [
|
||||
@ -336,9 +357,9 @@ const selectedColumns = ref([
|
||||
// 查询参数
|
||||
const queryParams = reactive({
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
pageSize: 20, // 修改默认显示条数
|
||||
source: null,
|
||||
datetime: null,
|
||||
// datetime 已移除,使用 dateRange
|
||||
});
|
||||
|
||||
// 表单数据
|
||||
@ -382,6 +403,8 @@ const getCurrentUsername = () => {
|
||||
/** 查询列表 */
|
||||
function getList() {
|
||||
loading.value = true;
|
||||
// 处理日期范围
|
||||
proxy.addDateRange(queryParams, dateRange.value);
|
||||
listYogurtTest(queryParams).then(response => {
|
||||
yogurtTestList.value = response.rows || [];
|
||||
total.value = response.total || 0;
|
||||
@ -468,9 +491,9 @@ function handleQuery() {
|
||||
|
||||
/** 重置按钮操作 */
|
||||
function resetQuery() {
|
||||
dateRange.value = []; // 清空日期范围
|
||||
Object.assign(queryParams, {
|
||||
source: null,
|
||||
datetime: null,
|
||||
});
|
||||
handleQuery();
|
||||
}
|
||||
|
||||
618
src/views/embryo/flush/index.vue
Normal file
618
src/views/embryo/flush/index.vue
Normal file
@ -0,0 +1,618 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<!-- 搜索区域 -->
|
||||
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="100px">
|
||||
<el-form-item label="冲胚时间" style="width: 388px;">
|
||||
<el-date-picker
|
||||
v-model="dateRange"
|
||||
value-format="YYYY-MM-DD"
|
||||
type="daterange"
|
||||
range-separator="-"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
></el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="供体母号" prop="donorFemaleNo">
|
||||
<el-input
|
||||
v-model="queryParams.donorFemaleNo"
|
||||
placeholder="请输入供体母号"
|
||||
clearable
|
||||
@keyup.enter="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="供体父号" prop="donorMaleNo">
|
||||
<el-input
|
||||
v-model="queryParams.donorMaleNo"
|
||||
placeholder="请输入供体父号"
|
||||
clearable
|
||||
@keyup.enter="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<!-- 操作按钮区域 -->
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="primary"
|
||||
plain
|
||||
icon="Plus"
|
||||
@click="handleAdd"
|
||||
v-hasPermi="['embryo:flush:add']"
|
||||
>新增</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="success"
|
||||
plain
|
||||
icon="Edit"
|
||||
:disabled="single"
|
||||
@click="handleUpdate"
|
||||
v-hasPermi="['embryo:flush:edit']"
|
||||
>修改</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="danger"
|
||||
plain
|
||||
icon="Delete"
|
||||
:disabled="multiple"
|
||||
@click="handleDelete"
|
||||
v-hasPermi="['embryo:flush:remove']"
|
||||
>删除</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="warning"
|
||||
plain
|
||||
icon="Download"
|
||||
@click="handleExport"
|
||||
v-hasPermi="['embryo:flush:export']"
|
||||
>导出</el-button>
|
||||
</el-col>
|
||||
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<!-- 数据表格 -->
|
||||
<el-table v-loading="loading" :data="flushList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="冲胚时间" align="center" prop="flushTime" width="110">
|
||||
<template #default="scope">
|
||||
<span>{{ parseTime(scope.row.flushTime, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="胚胎品种" align="center" prop="embryoVariety" width="100" />
|
||||
<el-table-column label="供体母号" align="center" prop="donorFemaleNo" width="110" />
|
||||
<el-table-column label="母羊品种" align="center" prop="donorFemaleVariety" width="100" />
|
||||
<el-table-column label="供体父号" align="center" prop="donorMaleNo" width="110" />
|
||||
<el-table-column label="公羊品种" align="center" prop="donorMaleVariety" width="100" />
|
||||
<el-table-column label="胎龄(天)" align="center" prop="embryoAge" width="80" />
|
||||
<el-table-column label="A+" align="center" prop="gradeAPlus" width="60" />
|
||||
<el-table-column label="A" align="center" prop="gradeA" width="60" />
|
||||
<el-table-column label="B" align="center" prop="gradeB" width="60" />
|
||||
<el-table-column label="C" align="center" prop="gradeC" width="60" />
|
||||
<el-table-column label="D" align="center" prop="gradeD" width="60" />
|
||||
<el-table-column label="2/4细胞" align="center" prop="cell24" width="70" />
|
||||
<el-table-column label="8细胞" align="center" prop="cell8" width="60" />
|
||||
<el-table-column label="16细胞" align="center" prop="cell16" width="70" />
|
||||
<el-table-column label="未受精" align="center" prop="unfertilized" width="70" />
|
||||
<el-table-column label="退化" align="center" prop="degenerated" width="60" />
|
||||
<el-table-column label="冲胚数" align="center" prop="totalEmbryo" width="70" />
|
||||
<el-table-column label="有效胚" align="center" prop="validEmbryo" width="70" />
|
||||
<el-table-column label="移胚数" align="center" prop="transferred" width="70" />
|
||||
<el-table-column label="受体数" align="center" prop="recipientCnt" width="70" />
|
||||
<el-table-column label="胚胎类型" align="center" prop="embryoType" width="90" />
|
||||
<el-table-column label="胚胎来源" align="center" prop="embryoSource" width="90" />
|
||||
<el-table-column label="去向" align="center" prop="destination" width="80" />
|
||||
<el-table-column label="存储方式" align="center" prop="storageMethod" width="100" />
|
||||
<el-table-column label="冲胚人" align="center" prop="flushOperator" width="80" />
|
||||
<el-table-column label="捡胚人" align="center" prop="collectOperator" width="80" />
|
||||
<el-table-column label="所在牧场" align="center" prop="ranchName" width="100" />
|
||||
<el-table-column label="备注" align="center" prop="remark" width="120" show-overflow-tooltip />
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="150" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['embryo:flush:edit']">修改</el-button>
|
||||
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['embryo:flush:remove']">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!-- 分页 -->
|
||||
<pagination
|
||||
v-show="total>0"
|
||||
:total="total"
|
||||
v-model:page="queryParams.pageNum"
|
||||
v-model:limit="queryParams.pageSize"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
<!-- 添加或修改冲胚记录对话框 -->
|
||||
<el-dialog :title="title" v-model="open" width="900px" append-to-body>
|
||||
<el-form ref="flushRef" :model="form" :rules="rules" label-width="100px">
|
||||
<!-- 基础信息 -->
|
||||
<el-divider content-position="left">基础信息</el-divider>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="8">
|
||||
<el-form-item label="冲胚时间" prop="flushTime">
|
||||
<el-date-picker clearable
|
||||
v-model="form.flushTime"
|
||||
type="date"
|
||||
value-format="YYYY-MM-DD"
|
||||
placeholder="选择冲胚时间"
|
||||
style="width: 100%"
|
||||
@change="handleFlushTimeChange">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="供体母号" prop="donorFemaleNo">
|
||||
<el-select
|
||||
v-model="form.donorFemaleNo"
|
||||
filterable
|
||||
placeholder="请选择供体母羊"
|
||||
@change="handleDonorFemaleChange"
|
||||
style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in donorFemaleOptions"
|
||||
:key="item.manageTag"
|
||||
:label="item.manageTag"
|
||||
:value="item.manageTag">
|
||||
<span>{{ item.manageTag }}</span>
|
||||
<span style="float: right; color: #8492a6; font-size: 12px">{{ item.variety }}</span>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="母羊品种">
|
||||
<el-input v-model="form.donorFemaleVariety" disabled placeholder="自动填充" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="8">
|
||||
<el-form-item label="供体父号" prop="donorMaleNo">
|
||||
<el-input v-model="form.donorMaleNo" placeholder="自动填充/可修改" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="公羊品种">
|
||||
<el-input v-model="form.donorMaleVariety" disabled placeholder="自动填充" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="胚胎品种">
|
||||
<el-input v-model="form.embryoVariety" placeholder="自动计算/可修改" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="8">
|
||||
<el-form-item label="胎龄(天)">
|
||||
<el-input-number v-model="form.embryoAge" :min="0" controls-position="right" placeholder="自动计算" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="所在牧场">
|
||||
<el-input v-model="form.ranchName" disabled placeholder="自动填充" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<!-- 胚胎等级 -->
|
||||
<el-divider content-position="left">胚胎等级</el-divider>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="4">
|
||||
<el-form-item label="A+">
|
||||
<el-input-number v-model="form.gradeAPlus" :min="0" controls-position="right" @change="calculateTotal" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="A">
|
||||
<el-input-number v-model="form.gradeA" :min="0" controls-position="right" @change="calculateTotal" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="B">
|
||||
<el-input-number v-model="form.gradeB" :min="0" controls-position="right" @change="calculateTotal" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="C">
|
||||
<el-input-number v-model="form.gradeC" :min="0" controls-position="right" @change="calculateTotal" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="D">
|
||||
<el-input-number v-model="form.gradeD" :min="0" controls-position="right" @change="calculateTotal" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<!-- 发育阶段 -->
|
||||
<el-divider content-position="left">发育阶段</el-divider>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="4">
|
||||
<el-form-item label="2/4细胞">
|
||||
<el-input-number v-model="form.cell24" :min="0" controls-position="right" @change="calculateTotal" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="8细胞">
|
||||
<el-input-number v-model="form.cell8" :min="0" controls-position="right" @change="calculateTotal" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="16细胞">
|
||||
<el-input-number v-model="form.cell16" :min="0" controls-position="right" @change="calculateTotal" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="未受精">
|
||||
<el-input-number v-model="form.unfertilized" :min="0" controls-position="right" @change="calculateTotal" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="退化">
|
||||
<el-input-number v-model="form.degenerated" :min="0" controls-position="right" @change="calculateTotal" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<!-- 统计信息 -->
|
||||
<el-divider content-position="left">统计信息</el-divider>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="6">
|
||||
<el-form-item label="冲胚数">
|
||||
<el-input v-model="form.totalEmbryo" disabled placeholder="自动计算" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="有效胚">
|
||||
<el-input v-model="form.validEmbryo" disabled placeholder="自动计算" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="移胚数" prop="transferred">
|
||||
<el-input-number v-model="form.transferred" :min="0" controls-position="right" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="移植受体数" prop="recipientCnt">
|
||||
<el-input-number v-model="form.recipientCnt" :min="0" controls-position="right" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<!-- 其他信息 -->
|
||||
<el-divider content-position="left">其他信息</el-divider>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="6">
|
||||
<el-form-item label="胚胎类型" prop="embryoType">
|
||||
<el-select v-model="form.embryoType" placeholder="请选择" style="width: 100%">
|
||||
<el-option label="体内供体" value="体内供体" />
|
||||
<el-option label="体外供体" value="体外供体" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="胚胎来源" prop="embryoSource">
|
||||
<el-select v-model="form.embryoSource" placeholder="请选择" style="width: 100%">
|
||||
<el-option label="自繁" value="自繁" />
|
||||
<el-option label="购入" value="购入" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="去向" prop="destination">
|
||||
<el-input v-model="form.destination" placeholder="默认遗弃可自行修改" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="存储方式" prop="storageMethod">
|
||||
<el-input v-model="form.storageMethod" placeholder="默认胚胎保存液" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="6">
|
||||
<el-form-item label="冲胚人" prop="flushOperator">
|
||||
<el-input v-model="form.flushOperator" placeholder="请输入冲胚人" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="捡胚人" prop="collectOperator">
|
||||
<el-input v-model="form.collectOperator" placeholder="请输入捡胚人" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" :rows="1" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup name="Flush">
|
||||
import { listFlush, getFlush, delFlush, addFlush, updateFlush, getDonorInfo, getDonorFemaleList } from "@/api/embryo/flush"
|
||||
|
||||
const { proxy } = getCurrentInstance()
|
||||
|
||||
const flushList = ref([])
|
||||
const open = ref(false)
|
||||
const loading = ref(true)
|
||||
const showSearch = ref(true)
|
||||
const ids = ref([])
|
||||
const single = ref(true)
|
||||
const multiple = ref(true)
|
||||
const total = ref(0)
|
||||
const title = ref("")
|
||||
const dateRange = ref([])
|
||||
const donorFemaleOptions = ref([])
|
||||
// 保存配种日期用于计算胎龄
|
||||
const matingDateCache = ref(null)
|
||||
|
||||
const data = reactive({
|
||||
form: {},
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
donorFemaleNo: null,
|
||||
donorMaleNo: null
|
||||
},
|
||||
rules: {
|
||||
flushTime: [
|
||||
{ required: true, message: "冲胚时间不能为空", trigger: "blur" }
|
||||
],
|
||||
donorFemaleNo: [
|
||||
{ required: true, message: "供体母号不能为空", trigger: "change" }
|
||||
],
|
||||
embryoType: [
|
||||
{ required: true, message: "胚胎类型不能为空", trigger: "change" }
|
||||
],
|
||||
embryoSource: [
|
||||
{ required: true, message: "胚胎来源不能为空", trigger: "change" }
|
||||
],
|
||||
flushOperator: [
|
||||
{ required: true, message: "冲胚人不能为空", trigger: "blur" }
|
||||
],
|
||||
collectOperator: [
|
||||
{ required: true, message: "捡胚人不能为空", trigger: "blur" }
|
||||
]
|
||||
}
|
||||
})
|
||||
|
||||
const { queryParams, form, rules } = toRefs(data)
|
||||
|
||||
/** 查询冲胚记录列表 */
|
||||
function getList() {
|
||||
loading.value = true
|
||||
listFlush(proxy.addDateRange(queryParams.value, dateRange.value, 'FlushTime')).then(response => {
|
||||
flushList.value = response.rows
|
||||
total.value = response.total
|
||||
loading.value = false
|
||||
})
|
||||
}
|
||||
|
||||
/** 加载供体母羊下拉列表 */
|
||||
function loadDonorFemaleList() {
|
||||
getDonorFemaleList().then(response => {
|
||||
donorFemaleOptions.value = response.data || []
|
||||
}).catch(error => {
|
||||
console.error('加载供体母羊列表失败:', error)
|
||||
donorFemaleOptions.value = []
|
||||
})
|
||||
}
|
||||
|
||||
// 取消按钮
|
||||
function cancel() {
|
||||
open.value = false
|
||||
reset()
|
||||
}
|
||||
|
||||
// 表单重置
|
||||
function reset() {
|
||||
form.value = {
|
||||
id: null,
|
||||
flushTime: proxy.parseTime(new Date(), '{y}-{m}-{d}'),
|
||||
donorFemaleNo: null,
|
||||
donorFemaleVariety: null,
|
||||
donorMaleNo: null,
|
||||
donorMaleVariety: null,
|
||||
embryoVariety: null,
|
||||
embryoAge: null,
|
||||
gradeAPlus: 0,
|
||||
gradeA: 0,
|
||||
gradeB: 0,
|
||||
gradeC: 0,
|
||||
gradeD: 0,
|
||||
cell24: 0,
|
||||
cell8: 0,
|
||||
cell16: 0,
|
||||
unfertilized: 0,
|
||||
degenerated: 0,
|
||||
totalEmbryo: 0,
|
||||
validEmbryo: 0,
|
||||
transferred: 0,
|
||||
recipientCnt: 0,
|
||||
embryoType: null,
|
||||
embryoSource: '自繁',
|
||||
destination: '遗弃',
|
||||
storageMethod: '胚胎保存液',
|
||||
flushOperator: null,
|
||||
collectOperator: null,
|
||||
ranchId: null,
|
||||
ranchName: null,
|
||||
remark: null
|
||||
}
|
||||
matingDateCache.value = null
|
||||
proxy.resetForm("flushRef")
|
||||
}
|
||||
|
||||
/** 搜索按钮操作 */
|
||||
function handleQuery() {
|
||||
queryParams.value.pageNum = 1
|
||||
getList()
|
||||
}
|
||||
|
||||
/** 重置按钮操作 */
|
||||
function resetQuery() {
|
||||
dateRange.value = []
|
||||
proxy.resetForm("queryRef")
|
||||
handleQuery()
|
||||
}
|
||||
|
||||
// 多选框选中数据
|
||||
function handleSelectionChange(selection) {
|
||||
ids.value = selection.map(item => item.id)
|
||||
single.value = selection.length != 1
|
||||
multiple.value = !selection.length
|
||||
}
|
||||
|
||||
/** 新增按钮操作 */
|
||||
function handleAdd() {
|
||||
reset()
|
||||
loadDonorFemaleList()
|
||||
open.value = true
|
||||
title.value = "添加冲胚记录"
|
||||
}
|
||||
|
||||
/** 修改按钮操作 */
|
||||
function handleUpdate(row) {
|
||||
reset()
|
||||
loadDonorFemaleList()
|
||||
const _id = row.id || ids.value
|
||||
getFlush(_id).then(response => {
|
||||
form.value = response.data
|
||||
open.value = true
|
||||
title.value = "修改冲胚记录"
|
||||
})
|
||||
}
|
||||
|
||||
/** 冲胚时间变化时重新计算胎龄 */
|
||||
function handleFlushTimeChange(val) {
|
||||
calculateEmbryoAge()
|
||||
}
|
||||
|
||||
/** 供体母羊选择变化 */
|
||||
function handleDonorFemaleChange(val) {
|
||||
if (!val) {
|
||||
form.value.donorFemaleVariety = null
|
||||
form.value.donorMaleNo = null
|
||||
form.value.donorMaleVariety = null
|
||||
form.value.embryoVariety = null
|
||||
form.value.ranchId = null
|
||||
form.value.ranchName = null
|
||||
form.value.embryoAge = null
|
||||
matingDateCache.value = null
|
||||
return
|
||||
}
|
||||
|
||||
// 调用接口获取关联信息
|
||||
getDonorInfo(val).then(response => {
|
||||
const info = response.data || {}
|
||||
form.value.donorFemaleVariety = info.donorFemaleVariety || null
|
||||
form.value.donorMaleNo = info.donorMaleNo || null
|
||||
form.value.donorMaleVariety = info.donorMaleVariety || null
|
||||
form.value.embryoVariety = info.embryoVariety || null
|
||||
form.value.ranchId = info.ranchId || null
|
||||
form.value.ranchName = info.ranchName || null
|
||||
|
||||
// 缓存配种日期
|
||||
matingDateCache.value = info.matingDate || null
|
||||
|
||||
// 计算胎龄
|
||||
calculateEmbryoAge()
|
||||
}).catch(error => {
|
||||
console.error('获取供体母羊关联信息失败:', error)
|
||||
proxy.$modal.msgError('获取供体母羊信息失败')
|
||||
})
|
||||
}
|
||||
|
||||
/** 计算胎龄 */
|
||||
function calculateEmbryoAge() {
|
||||
if (matingDateCache.value && form.value.flushTime) {
|
||||
const matingDate = new Date(matingDateCache.value)
|
||||
const flushDate = new Date(form.value.flushTime)
|
||||
const diffTime = flushDate.getTime() - matingDate.getTime()
|
||||
const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24))
|
||||
form.value.embryoAge = diffDays > 0 ? diffDays : 0
|
||||
}
|
||||
}
|
||||
|
||||
/** 计算冲胚数和有效胚 */
|
||||
function calculateTotal() {
|
||||
const gradeAPlus = form.value.gradeAPlus || 0
|
||||
const gradeA = form.value.gradeA || 0
|
||||
const gradeB = form.value.gradeB || 0
|
||||
const gradeC = form.value.gradeC || 0
|
||||
const gradeD = form.value.gradeD || 0
|
||||
const cell24 = form.value.cell24 || 0
|
||||
const cell8 = form.value.cell8 || 0
|
||||
const cell16 = form.value.cell16 || 0
|
||||
const unfertilized = form.value.unfertilized || 0
|
||||
const degenerated = form.value.degenerated || 0
|
||||
|
||||
// 有效胚 = A+ + A + B + C + D
|
||||
form.value.validEmbryo = gradeAPlus + gradeA + gradeB + gradeC + gradeD
|
||||
|
||||
// 冲胚数 = 所有数量总和
|
||||
form.value.totalEmbryo = gradeAPlus + gradeA + gradeB + gradeC + gradeD
|
||||
+ cell24 + cell8 + cell16 + unfertilized + degenerated
|
||||
}
|
||||
|
||||
/** 提交按钮 */
|
||||
function submitForm() {
|
||||
proxy.$refs["flushRef"].validate(valid => {
|
||||
if (valid) {
|
||||
if (form.value.id != null) {
|
||||
updateFlush(form.value).then(response => {
|
||||
proxy.$modal.msgSuccess("修改成功")
|
||||
open.value = false
|
||||
getList()
|
||||
})
|
||||
} else {
|
||||
addFlush(form.value).then(response => {
|
||||
proxy.$modal.msgSuccess("新增成功")
|
||||
open.value = false
|
||||
getList()
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/** 删除按钮操作 */
|
||||
function handleDelete(row) {
|
||||
const _ids = row.id || ids.value
|
||||
proxy.$modal.confirm('是否确认删除所选的冲胚记录?').then(function () {
|
||||
return delFlush(_ids)
|
||||
}).then(() => {
|
||||
getList()
|
||||
proxy.$modal.msgSuccess("删除成功")
|
||||
}).catch(() => {
|
||||
})
|
||||
}
|
||||
|
||||
/** 导出按钮操作 */
|
||||
function handleExport() {
|
||||
proxy.download('embryo/flush/export', {
|
||||
...queryParams.value
|
||||
}, `冲胚记录_${new Date().getTime()}.xlsx`)
|
||||
}
|
||||
|
||||
getList()
|
||||
</script>
|
||||
530
src/views/frozen/embryo/index.vue
Normal file
530
src/views/frozen/embryo/index.vue
Normal file
@ -0,0 +1,530 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form-item label="胚胎编号" prop="code">
|
||||
<el-input v-model="queryParams.code" placeholder="请输入胚胎编号" clearable @keyup.enter="handleQuery"
|
||||
style="width:150px;" />
|
||||
</el-form-item>
|
||||
<el-form-item label="冻胚日期" style="width: 308px">
|
||||
<el-date-picker v-model="daterangeFreezeDate" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
|
||||
start-placeholder="开始日期" end-placeholder="结束日期" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="技术员" prop="tech">
|
||||
<el-input v-model="queryParams.tech" placeholder="请输入技术员" clearable @keyup.enter="handleQuery"
|
||||
style="width:150px;" />
|
||||
</el-form-item>
|
||||
<el-form-item label="出库日期" style="width: 308px">
|
||||
<el-date-picker v-model="daterangeOutDate" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
|
||||
start-placeholder="开始日期" end-placeholder="结束日期" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['frozen:embryo:add']">新增</el-button>
|
||||
</el-col>
|
||||
<!-- <el-col :span="1.5">
|
||||
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
|
||||
v-hasPermi="['frozen:embryo:edit']">修改</el-button>
|
||||
</el-col> -->
|
||||
<el-col :span="1.5">
|
||||
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
|
||||
v-hasPermi="['frozen:embryo:remove']">删除</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="warning" plain icon="Download" @click="handleExport"
|
||||
v-hasPermi="['frozen:embryo:export']">导出</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="warning" plain icon="Close" :disabled="multiple" @click="handleDiscard"
|
||||
v-hasPermi="['frozen:embryo:discard']">
|
||||
废弃
|
||||
</el-button>
|
||||
</el-col>
|
||||
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="embryoList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<!-- <el-table-column label="主键" align="center" prop="id" /> -->
|
||||
<el-table-column label="胚胎编号" align="center" prop="code" width="130px" fixed="fixed" />
|
||||
<el-table-column label="冻胚日期" align="center" prop="freezeDate" width="130px">
|
||||
<template #default="scope">
|
||||
<span>{{ parseTime(scope.row.freezeDate, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="供体公羊耳号" align="center" prop="drId" width="130px" />
|
||||
<el-table-column label="供体公羊品种" align="center" prop="drBreed" width="130px" />
|
||||
<el-table-column label="供体母羊耳号" align="center" prop="deId" width="130px" />
|
||||
<el-table-column label="供体母羊品种" align="center" prop="deBreed" width="130px" />
|
||||
<el-table-column label="胚胎品种" align="center" prop="embBreed" />
|
||||
<el-table-column label="胚胎阶段等级" align="center" prop="grade" width="130px" />
|
||||
<el-table-column label="胚胎数量" align="center" prop="qty" width="130px" sortable />
|
||||
<el-table-column label="是否性控" align="center" width="80">
|
||||
<template #default="scope">
|
||||
{{ scope.row.sexCtl === 1 ? '是' : '否' }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="状态" align="center" prop="status" />
|
||||
<el-table-column label="技术员" align="center" prop="tech" />
|
||||
<el-table-column label="液氮罐ID" align="center" prop="tankId" />
|
||||
<el-table-column label="提桶ID" align="center" prop="bucketId" />
|
||||
<el-table-column label="冷冻架ID" align="center" prop="rackId" />
|
||||
<el-table-column label="出库日期" align="center" prop="outDate" width="130px">
|
||||
<template #default="scope">
|
||||
<span>{{ parseTime(scope.row.outDate, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="废弃原因" align="center" prop="discardTxt" />
|
||||
<el-table-column label="备注" align="center" prop="remark" />
|
||||
<el-table-column label="创建人" align="center" prop="createBy" />
|
||||
<el-table-column label="创建时间" align="center" prop="createTime" width="160px">
|
||||
<template #default="scope">
|
||||
{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}') }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right">
|
||||
<template #default="scope">
|
||||
<!-- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['frozen:embryo:edit']">修改</el-button> -->
|
||||
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
|
||||
v-hasPermi="['frozen:embryo:remove']">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
|
||||
v-model:limit="queryParams.pageSize" @pagination="getList" />
|
||||
|
||||
<!-- 添加或修改冻胚库存对话框 -->
|
||||
<el-dialog :title="title" v-model="open" width="700px" append-to-body>
|
||||
<el-form ref="embryoRef" :model="form" :rules="rules" label-width="100px">
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="胚胎编号" prop="code">
|
||||
<el-input v-model="form.code" placeholder="请输入胚胎编号(YS+日期+序号)" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="冻胚日期" prop="freezeDate">
|
||||
<el-date-picker clearable v-model="form.freezeDate" type="date" value-format="YYYY-MM-DD"
|
||||
placeholder="请选择冻胚日期" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="供体母羊耳号">
|
||||
<el-input v-model="form.deId" placeholder="请输入耳号" @blur="getFlushInfo" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="供体母羊品种">
|
||||
<el-input v-model="form.deBreed" placeholder="输入供体母羊耳号自动回显" disabled />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="供体公羊耳号">
|
||||
<el-input v-model="form.drId" placeholder="输入供体母羊耳号自动回显" disabled />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="供体公羊品种">
|
||||
<el-input v-model="form.drBreed" placeholder="输入供体母羊耳号自动回显" disabled />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="胚胎品种">
|
||||
<el-input v-model="form.embBreed" placeholder="输入供体母羊耳号自动回显" disabled />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="胚胎阶段等级" prop="grade">
|
||||
<el-select v-model="form.grade" placeholder="请选择阶段等级" clearable style="width: 100%"
|
||||
@change="onGradeChange">
|
||||
<el-option v-for="opt in GRADE_OPTS" :key="opt.value" :label="opt.label" :value="opt.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="胚胎数量" prop="qty">
|
||||
<el-input v-model="form.qty" placeholder="请输入胚胎数量" disabled />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="是否性控" prop="sexCtl">
|
||||
<el-select v-model="form.sexCtl" placeholder="请选择" clearable style="width: 100%">
|
||||
<el-option v-for="opt in SEX_CTL_OPTS" :key="opt.value" :label="opt.label" :value="opt.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="技术员" prop="tech">
|
||||
<el-input v-model="form.tech" placeholder="请输入技术员" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="液氮罐ID" prop="tankId">
|
||||
<el-select v-model="form.tankId" placeholder="请选择液氮罐" clearable style="width: 100%">
|
||||
<el-option v-for="opt in NUM_1_10" :key="opt.value" :label="opt.label" :value="opt.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="提桶ID" prop="bucketId">
|
||||
<el-select v-model="form.bucketId" placeholder="请选择提桶" clearable style="width: 100%">
|
||||
<el-option v-for="opt in NUM_1_10" :key="opt.value" :label="opt.label" :value="opt.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="冷冻架ID" prop="rackId">
|
||||
<el-select v-model="form.rackId" placeholder="请选择冷冻架" clearable style="width: 100%">
|
||||
<el-option v-for="opt in NUM_1_10" :key="opt.value" :label="opt.label" :value="opt.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24">
|
||||
<el-form-item label="出库日期" prop="outDate">
|
||||
<el-date-picker clearable v-model="form.outDate" type="date" value-format="YYYY-MM-DD"
|
||||
placeholder="请选择出库日期" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24">
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model="form.remark" type="textarea" :rows="2" placeholder="请输入备注" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
|
||||
<!-- 批量废弃弹窗 -->
|
||||
<el-dialog title="批量废弃" v-model="discardOpen" width="400px" append-to-body>
|
||||
<el-form>
|
||||
<el-form-item label="胚胎编号(灰色为已废弃)">
|
||||
<el-tag v-for="e in discardDisabled" :key="'d-' + e.id"
|
||||
style="margin-right:4px;background:#f5f5f5;color:#909399;border:none;">{{ e.code }}</el-tag>
|
||||
<el-tag v-for="e in discardSelection" :key="e.id" style="margin-right:4px;">{{ e.code }}</el-tag>
|
||||
<span class="tag-count">已选 {{ discardSelection.length }} 个</span>
|
||||
</el-form-item>
|
||||
<el-form-item label="废弃原因">
|
||||
<el-input v-model="discardReason" type="textarea" :rows="3" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="discardOpen = false">取消</el-button>
|
||||
<el-button type="primary" @click="submitDiscard">确定</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup name="Embryo">
|
||||
import { listEmbryo, getEmbryo, delEmbryo, addEmbryo, updateEmbryo, getFlushInfoByEwe, getQtyByGrade, discardEmbryo } from "@/api/frozen/embryo"
|
||||
import request from '@/utils/request'
|
||||
const { proxy } = getCurrentInstance()
|
||||
|
||||
const embryoList = ref([])
|
||||
const open = ref(false)
|
||||
const loading = ref(true)
|
||||
const showSearch = ref(true)
|
||||
const ids = ref([])
|
||||
const single = ref(true)
|
||||
const multiple = ref(true)
|
||||
const total = ref(0)
|
||||
const title = ref("")
|
||||
// 1. 胚胎阶段等级
|
||||
const GRADE_OPTS = [
|
||||
{ label: 'A', value: 'A' },
|
||||
{ label: 'B', value: 'B' },
|
||||
{ label: 'C', value: 'C' },
|
||||
{ label: 'D', value: 'D' },
|
||||
{ label: '囊胚', value: '囊胚' },
|
||||
{ label: '桑椹胚', value: '桑椹胚' }
|
||||
]
|
||||
|
||||
// 2. 是否性控
|
||||
const SEX_CTL_OPTS = [
|
||||
{ label: '是', value: 1 },
|
||||
{ label: '否', value: 0 }
|
||||
]
|
||||
|
||||
// 3. 液氮罐/提桶/冷冻架编号 1-10
|
||||
const NUM_1_10 = Array.from({ length: 10 }, (_, i) => ({
|
||||
label: i + 1 + '',
|
||||
value: i + 1
|
||||
}))
|
||||
const daterangeFreezeDate = ref([]) // 冻胚日期段
|
||||
const daterangeOutDate = ref([]) // 出库日期段
|
||||
const discardSelection = ref([]) // 待废弃
|
||||
const discardDisabled = ref([]) // 已废弃
|
||||
const discardReason = ref('')
|
||||
const discardOpen = ref(false)
|
||||
const data = reactive({
|
||||
form: {},
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
code: null,
|
||||
grade: null,
|
||||
status: null,
|
||||
tech: null,
|
||||
params: {}
|
||||
},
|
||||
rules: {
|
||||
code: [
|
||||
{ required: true, message: "胚胎编号不能为空", trigger: "blur" }
|
||||
],
|
||||
}
|
||||
})
|
||||
|
||||
const { queryParams, form, rules } = toRefs(data)
|
||||
|
||||
/** 查询冻胚库存列表 */
|
||||
function getList() {
|
||||
loading.value = true
|
||||
// 保险:确保 params 存在
|
||||
queryParams.value.params = queryParams.value.params || {}
|
||||
|
||||
// 再塞时间段
|
||||
if (daterangeFreezeDate.value && daterangeFreezeDate.value.length === 2) {
|
||||
queryParams.value.params.beginFreezeDate = daterangeFreezeDate.value[0]
|
||||
queryParams.value.params.endFreezeDate = daterangeFreezeDate.value[1]
|
||||
} else {
|
||||
delete queryParams.value.params.beginFreezeDate
|
||||
delete queryParams.value.params.endFreezeDate
|
||||
}
|
||||
|
||||
if (daterangeOutDate.value && daterangeOutDate.value.length === 2) {
|
||||
queryParams.value.params.beginOutDate = daterangeOutDate.value[0]
|
||||
queryParams.value.params.endOutDate = daterangeOutDate.value[1]
|
||||
} else {
|
||||
delete queryParams.value.params.beginOutDate
|
||||
delete queryParams.value.params.endOutDate
|
||||
}
|
||||
|
||||
listEmbryo(queryParams.value).then(response => {
|
||||
embryoList.value = response.rows
|
||||
total.value = response.total
|
||||
loading.value = false
|
||||
})
|
||||
}
|
||||
|
||||
// 取消按钮
|
||||
function cancel() {
|
||||
open.value = false
|
||||
reset()
|
||||
}
|
||||
|
||||
// 表单重置
|
||||
function reset() {
|
||||
form.value = {
|
||||
id: null,
|
||||
code: null,
|
||||
freezeDate: null,
|
||||
drId: null,
|
||||
drBreed: null,
|
||||
deId: null,
|
||||
deBreed: null,
|
||||
embBreed: null,
|
||||
grade: null,
|
||||
qty: null,
|
||||
sexCtl: 0,
|
||||
status: null,
|
||||
tech: null,
|
||||
tankId: null,
|
||||
bucketId: null,
|
||||
rackId: null,
|
||||
outDate: null,
|
||||
remark: null,
|
||||
createBy: null,
|
||||
createTime: null
|
||||
}
|
||||
proxy.resetForm("embryoRef")
|
||||
}
|
||||
|
||||
/** 搜索按钮操作 */
|
||||
function handleQuery() {
|
||||
queryParams.value.pageNum = 1
|
||||
getList()
|
||||
}
|
||||
|
||||
/** 重置按钮操作 */
|
||||
function resetQuery() {
|
||||
daterangeFreezeDate.value = []
|
||||
daterangeOutDate.value = []
|
||||
proxy.resetForm("queryRef")
|
||||
handleQuery()
|
||||
}
|
||||
|
||||
// 多选框选中数据
|
||||
function handleSelectionChange(selection) {
|
||||
ids.value = selection.map(item => item.id)
|
||||
single.value = selection.length != 1
|
||||
multiple.value = !selection.length
|
||||
}
|
||||
|
||||
/** 新增按钮操作 */
|
||||
function handleAdd() {
|
||||
reset()
|
||||
open.value = true
|
||||
title.value = "添加冻胚库存"
|
||||
}
|
||||
|
||||
/** 修改按钮操作 */
|
||||
function handleUpdate(row) {
|
||||
reset()
|
||||
const _id = row.id || ids.value
|
||||
getEmbryo(_id).then(response => {
|
||||
form.value = response.data
|
||||
open.value = true
|
||||
title.value = "修改冻胚库存"
|
||||
})
|
||||
}
|
||||
|
||||
/** 提交按钮 */
|
||||
function submitForm() {
|
||||
proxy.$refs["embryoRef"].validate(valid => {
|
||||
if (valid) {
|
||||
if (form.value.id != null) {
|
||||
updateEmbryo(form.value).then(response => {
|
||||
proxy.$modal.msgSuccess("修改成功")
|
||||
open.value = false
|
||||
getList()
|
||||
})
|
||||
} else {
|
||||
addEmbryo(form.value).then(response => {
|
||||
proxy.$modal.msgSuccess("新增成功")
|
||||
open.value = false
|
||||
getList()
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/** 删除按钮操作 */
|
||||
function handleDelete(row) {
|
||||
const _ids = row.id || ids.value
|
||||
proxy.$modal.confirm('是否确认删除冻胚库存编号为"' + _ids + '"的数据项?').then(function () {
|
||||
return delEmbryo(_ids)
|
||||
}).then(() => {
|
||||
getList()
|
||||
proxy.$modal.msgSuccess("删除成功")
|
||||
}).catch(() => { })
|
||||
}
|
||||
|
||||
/** 导出按钮操作 */
|
||||
function handleExport() {
|
||||
proxy.download('frozen/embryo/export', {
|
||||
...queryParams.value
|
||||
}, `embryo_${new Date().getTime()}.xlsx`)
|
||||
}
|
||||
|
||||
/** 失焦或点击“查询” */
|
||||
function getFlushInfo() {
|
||||
const eweNo = form.value.deId?.trim()
|
||||
if (!eweNo) {
|
||||
form.value.drId = ''
|
||||
form.value.drBreed = ''
|
||||
form.value.deBreed = ''
|
||||
form.value.embBreed = ''
|
||||
return
|
||||
}
|
||||
|
||||
getFlushInfoByEwe(eweNo).then(res => {
|
||||
if (res.code !== 200) {
|
||||
proxy.$modal.msgError(res.msg)
|
||||
form.value.drId = ''
|
||||
form.value.drBreed = ''
|
||||
form.value.deBreed = ''
|
||||
form.value.embBreed = ''
|
||||
return
|
||||
}
|
||||
// 正常回显
|
||||
form.value.drId = res.data.drId
|
||||
form.value.drBreed = res.data.drBreed
|
||||
form.value.deBreed = res.data.deBreed
|
||||
form.value.embBreed = res.data.embBreed
|
||||
}).catch(() => {
|
||||
form.value.drId = ''
|
||||
form.value.drBreed = ''
|
||||
form.value.deBreed = ''
|
||||
form.value.embBreed = ''
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 供体母羊耳号已存在时,根据所选胚胎阶段等级自动回显对应冲胚记录数量;
|
||||
*/
|
||||
function onGradeChange() {
|
||||
const grade = form.value.grade;
|
||||
const eweNo = form.value.deId?.trim();
|
||||
|
||||
if (!grade || !eweNo) {
|
||||
form.value.qty = null;
|
||||
return;
|
||||
}
|
||||
|
||||
getQtyByGrade(eweNo, grade).then(res => {
|
||||
form.value.qty = res.data;
|
||||
}).catch(() => {
|
||||
form.value.qty = null;
|
||||
});
|
||||
}
|
||||
|
||||
// 废弃
|
||||
function handleDiscard() {
|
||||
if (!ids.value.length) return proxy.$modal.msgWarning('请选择记录')
|
||||
const allSelected = embryoList.value.filter(e => ids.value.includes(e.id))
|
||||
discardSelection.value = allSelected.filter(e => e.status !== '废弃')
|
||||
discardDisabled.value = allSelected.filter(e => e.status === '废弃')
|
||||
if (!discardSelection.value.length) {
|
||||
proxy.$modal.msgWarning('所选记录已全部废弃')
|
||||
return
|
||||
}
|
||||
discardReason.value = ''
|
||||
discardOpen.value = true
|
||||
}
|
||||
|
||||
function submitDiscard() {
|
||||
const data = discardSelection.value.map(e => ({
|
||||
id: e.id,
|
||||
discardTxt: discardReason.value.trim()
|
||||
}))
|
||||
request.put('/frozen/embryo/batchDiscard', data).then(() => {
|
||||
proxy.$modal.msgSuccess('废弃成功')
|
||||
discardOpen.value = false
|
||||
getList()
|
||||
})
|
||||
}
|
||||
getList()
|
||||
</script>
|
||||
<style>
|
||||
.tag-count {
|
||||
color: #606266;
|
||||
background-color: #f5f7fa;
|
||||
padding: 2px 8px;
|
||||
border-radius: 12px;
|
||||
font-size: 12px;
|
||||
margin-left: 8px;
|
||||
}
|
||||
</style>
|
||||
416
src/views/frozen/sale/index.vue
Normal file
416
src/views/frozen/sale/index.vue
Normal file
@ -0,0 +1,416 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form-item label="销售日期" prop="saleDate">
|
||||
<el-date-picker clearable v-model="queryParams.saleDate" type="date" value-format="YYYY-MM-DD"
|
||||
placeholder="请选择销售日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="客户名称" prop="custName">
|
||||
<el-input v-model="queryParams.custName" placeholder="请输入客户名称" clearable @keyup.enter="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="客户电话" prop="custPhone">
|
||||
<el-input v-model="queryParams.custPhone" placeholder="请输入客户电话" clearable @keyup.enter="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="销售人员" prop="salesper">
|
||||
<el-input v-model="queryParams.salesper" placeholder="请输入销售人员" clearable @keyup.enter="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="检疫证号" prop="quaranNo">
|
||||
<el-input v-model="queryParams.quaranNo" placeholder="请输入检疫证号" clearable @keyup.enter="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="审批编号" prop="apprNo">
|
||||
<el-input v-model="queryParams.apprNo" placeholder="请输入审批编号" clearable @keyup.enter="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="总价" prop="price">
|
||||
<el-input v-model="queryParams.price" placeholder="请输入总价" clearable @keyup.enter="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="技术员" prop="tech">
|
||||
<el-input v-model="queryParams.tech" placeholder="请输入技术员" clearable @keyup.enter="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['sale:sale:add']">新增</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdateOrView"
|
||||
v-hasPermi="['sale:sale:edit']">修改</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
|
||||
v-hasPermi="['sale:sale:remove']">删除</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="warning" plain icon="Download" @click="handleExport"
|
||||
v-hasPermi="['sale:sale:export']">导出</el-button>
|
||||
</el-col>
|
||||
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="saleList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="主键" align="center" prop="id" />
|
||||
<el-table-column label="销售日期" align="center" prop="saleDate" width="180">
|
||||
<template #default="scope">
|
||||
<span>{{ parseTime(scope.row.saleDate, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="客户名称" align="center" prop="custName" />
|
||||
<el-table-column label="客户电话" align="center" prop="custPhone" />
|
||||
<el-table-column label="客户地址" align="center" prop="custAddr" />
|
||||
<el-table-column label="销售人员" align="center" prop="salesper" />
|
||||
<el-table-column label="检疫证号" align="center" prop="quaranNo" />
|
||||
<el-table-column label="审批编号" align="center" prop="apprNo" />
|
||||
<el-table-column label="总价" align="center" prop="price" />
|
||||
<el-table-column label="技术员" align="center" prop="tech" />
|
||||
<el-table-column label="备注" align="center" prop="remark" />
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template #default="scope">
|
||||
<el-button link type="primary" icon="Edit" @click="handleUpdateOrView(scope.row, 'view')"
|
||||
v-hasPermi="['sale:sale:edit']">销售项目</el-button>
|
||||
<el-button link type="primary" icon="Edit" @click="handleUpdateOrView(scope.row)"
|
||||
v-hasPermi="['sale:sale:edit']">修改</el-button>
|
||||
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
|
||||
v-hasPermi="['sale:sale:remove']">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
|
||||
v-model:limit="queryParams.pageSize" @pagination="getList" />
|
||||
|
||||
<!-- 添加或修改销售主单对话框 -->
|
||||
<el-dialog :title="title" v-model="open" width="1200px" append-to-body>
|
||||
<el-form ref="saleRef" :model="form" :rules="rules" label-width="80px">
|
||||
<el-form-item label="销售日期" prop="saleDate">
|
||||
<el-date-picker clearable v-model="form.saleDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择销售日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="客户名称" prop="custName">
|
||||
<el-input v-model="form.custName" placeholder="请输入客户名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="客户电话" prop="custPhone">
|
||||
<el-input v-model="form.custPhone" placeholder="请输入客户电话" />
|
||||
</el-form-item>
|
||||
<el-form-item label="客户地址" prop="custAddr">
|
||||
<el-input v-model="form.custAddr" type="textarea" placeholder="请输入内容" />
|
||||
</el-form-item>
|
||||
<el-form-item label="销售人员" prop="salesper">
|
||||
<el-input v-model="form.salesper" placeholder="请输入销售人员" />
|
||||
</el-form-item>
|
||||
<el-form-item label="检疫证号" prop="quaranNo">
|
||||
<el-input v-model="form.quaranNo" placeholder="请输入检疫证号" />
|
||||
</el-form-item>
|
||||
<el-form-item label="审批编号" prop="apprNo">
|
||||
<el-input v-model="form.apprNo" placeholder="请输入审批编号" />
|
||||
</el-form-item>
|
||||
<el-form-item label="总价" prop="price">
|
||||
<el-input v-model="form.price" placeholder="请输入总价" />
|
||||
</el-form-item>
|
||||
<el-form-item label="技术员" prop="tech">
|
||||
<el-input v-model="form.tech" placeholder="请输入技术员" />
|
||||
</el-form-item>
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
|
||||
</el-form-item>
|
||||
<el-divider content-position="center">销售明细信息</el-divider>
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" icon="Plus" @click="handleAddDdSaleItem">添加</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="danger" icon="Delete" @click="handleDeleteDdSaleItem">删除</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-table :data="ddSaleItemList" :row-class-name="rowDdSaleItemIndex"
|
||||
@selection-change="handleDdSaleItemSelectionChange" ref="ddSaleItem">
|
||||
<el-table-column type="selection" width="50" align="center" />
|
||||
<el-table-column label="序号" align="center" prop="index" width="50" />
|
||||
<el-table-column label="明细类型" prop="itemType" width="150">
|
||||
<template #default="scope">
|
||||
<el-select v-model="scope.row.itemType" placeholder="请选择明细类型">
|
||||
<el-option v-for="dict in frozen_sale_item_type" :key="dict.value" :label="dict.label"
|
||||
:value="dict.value"></el-option>
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="胚胎编号或冻精号" prop="itemCode" width="150">
|
||||
<template #default="scope">
|
||||
<el-input v-model="scope.row.itemCode" placeholder="请输入胚胎编号或冻精号" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="数量" prop="qty" width="150">
|
||||
<template #default="scope">
|
||||
<el-input v-model="scope.row.qty" placeholder="请输入数量" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="单价" prop="unitPrice" width="150">
|
||||
<template #default="scope">
|
||||
<el-input v-model="scope.row.unitPrice" placeholder="请输入单价" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="所在液氮罐ID" prop="tankId" width="150">
|
||||
<template #default="scope">
|
||||
<el-input v-model="scope.row.tankId" placeholder="请输入所在液氮罐ID" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="所在提桶ID" prop="bucketId" width="150">
|
||||
<template #default="scope">
|
||||
<el-input v-model="scope.row.bucketId" placeholder="请输入所在提桶ID" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="所在冷冻架ID" prop="rackId" width="180">
|
||||
<template #default="scope">
|
||||
<el-input v-model="scope.row.rackId" placeholder="请输入所在冷冻架ID" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog :title="title" v-model="openView" width="1200px" append-to-body>
|
||||
<el-table :data="ddSaleItemList" :row-class-name="rowDdSaleItemIndex"
|
||||
@selection-change="handleDdSaleItemSelectionChange" ref="ddSaleItem">
|
||||
<el-table-column type="selection" width="50" align="center" disabled />
|
||||
<el-table-column label="序号" align="center" prop="index" width="50" />
|
||||
<el-table-column label="明细类型" prop="itemType" width="150">
|
||||
<template #default="scope">
|
||||
<el-select v-model="scope.row.itemType" placeholder="请选择明细类型" disabled>
|
||||
<el-option v-for="dict in frozen_sale_item_type" :key="dict.value" :label="dict.label"
|
||||
:value="dict.value"></el-option>
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="胚胎编号或冻精号" prop="itemCode" width="150" align="center" />
|
||||
<el-table-column label="数量" prop="qty" width="150" align="center" />
|
||||
|
||||
<el-table-column label="单价" prop="unitPrice" width="150" align="center" />
|
||||
<el-table-column label="所在液氮罐ID" prop="tankId" width="150" align="center" />
|
||||
<el-table-column label="所在提桶ID" prop="bucketId" width="150" align="center" />
|
||||
<el-table-column label="所在冷冻架ID" prop="rackId" width="180" align="center" />
|
||||
</el-table>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup name="Sale">
|
||||
import { listSale, getSale, delSale, addSale, updateSale } from "@/api/frozen/sale"
|
||||
import { tr } from "date-fns/locale"
|
||||
|
||||
const { proxy } = getCurrentInstance()
|
||||
const { frozen_sale_item_type } = proxy.useDict('frozen_sale_item_type')
|
||||
|
||||
const saleList = ref([])
|
||||
const ddSaleItemList = ref([])
|
||||
const open = ref(false)
|
||||
const openView = ref(false)
|
||||
const loading = ref(true)
|
||||
const showSearch = ref(true)
|
||||
const ids = ref([])
|
||||
const checkedDdSaleItem = ref([])
|
||||
const single = ref(true)
|
||||
const multiple = ref(true)
|
||||
const total = ref(0)
|
||||
const title = ref("")
|
||||
|
||||
const data = reactive({
|
||||
form: {},
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
saleDate: null,
|
||||
custName: null,
|
||||
custPhone: null,
|
||||
custAddr: null,
|
||||
salesper: null,
|
||||
quaranNo: null,
|
||||
apprNo: null,
|
||||
price: null,
|
||||
tech: null,
|
||||
},
|
||||
rules: {
|
||||
saleDate: [
|
||||
{ required: true, message: "销售日期不能为空", trigger: "blur" }
|
||||
],
|
||||
custName: [
|
||||
{ required: true, message: "客户名称不能为空", trigger: "blur" }
|
||||
],
|
||||
price: [
|
||||
{ required: true, message: "总价不能为空", trigger: "blur" }
|
||||
],
|
||||
tech: [
|
||||
{ required: true, message: "技术员不能为空", trigger: "blur" }
|
||||
],
|
||||
}
|
||||
})
|
||||
|
||||
const { queryParams, form, rules } = toRefs(data)
|
||||
|
||||
/** 查询销售主单列表 */
|
||||
function getList() {
|
||||
loading.value = true
|
||||
listSale(queryParams.value).then(response => {
|
||||
saleList.value = response.rows
|
||||
total.value = response.total
|
||||
loading.value = false
|
||||
})
|
||||
}
|
||||
|
||||
// 取消按钮
|
||||
function cancel() {
|
||||
open.value = false
|
||||
reset()
|
||||
}
|
||||
|
||||
// 表单重置
|
||||
function reset() {
|
||||
form.value = {
|
||||
id: null,
|
||||
saleDate: null,
|
||||
custName: null,
|
||||
custPhone: null,
|
||||
custAddr: null,
|
||||
salesper: null,
|
||||
quaranNo: null,
|
||||
apprNo: null,
|
||||
price: null,
|
||||
tech: null,
|
||||
remark: null,
|
||||
createBy: null,
|
||||
createTime: null
|
||||
}
|
||||
ddSaleItemList.value = []
|
||||
proxy.resetForm("saleRef")
|
||||
}
|
||||
|
||||
/** 搜索按钮操作 */
|
||||
function handleQuery() {
|
||||
queryParams.value.pageNum = 1
|
||||
getList()
|
||||
}
|
||||
|
||||
/** 重置按钮操作 */
|
||||
function resetQuery() {
|
||||
proxy.resetForm("queryRef")
|
||||
handleQuery()
|
||||
}
|
||||
|
||||
// 多选框选中数据
|
||||
function handleSelectionChange(selection) {
|
||||
ids.value = selection.map(item => item.id)
|
||||
single.value = selection.length != 1
|
||||
multiple.value = !selection.length
|
||||
}
|
||||
|
||||
/** 新增按钮操作 */
|
||||
function handleAdd() {
|
||||
reset()
|
||||
open.value = true
|
||||
title.value = "添加销售主单"
|
||||
}
|
||||
|
||||
/** 修改按钮操作 */
|
||||
function handleUpdateOrView(row, mode) {
|
||||
reset()
|
||||
const _id = row.id || ids.value
|
||||
getSale(_id).then(response => {
|
||||
form.value = response.data
|
||||
ddSaleItemList.value = response.data.ddSaleItemList
|
||||
if (mode === 'view') {
|
||||
openView.value = true
|
||||
title.value = "查看销售主单"
|
||||
} else {
|
||||
open.value = true
|
||||
title.value = "修改销售主单"
|
||||
}
|
||||
})
|
||||
}
|
||||
/** 提交按钮 */
|
||||
function submitForm() {
|
||||
proxy.$refs["saleRef"].validate(valid => {
|
||||
if (valid) {
|
||||
form.value.ddSaleItemList = ddSaleItemList.value
|
||||
if (form.value.id != null) {
|
||||
updateSale(form.value).then(response => {
|
||||
proxy.$modal.msgSuccess("修改成功")
|
||||
open.value = false
|
||||
getList()
|
||||
})
|
||||
} else {
|
||||
addSale(form.value).then(response => {
|
||||
proxy.$modal.msgSuccess("新增成功")
|
||||
open.value = false
|
||||
getList()
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/** 删除按钮操作 */
|
||||
function handleDelete(row) {
|
||||
const _ids = row.id || ids.value
|
||||
proxy.$modal.confirm('是否确认删除销售主单编号为"' + _ids + '"的数据项?').then(function () {
|
||||
return delSale(_ids)
|
||||
}).then(() => {
|
||||
getList()
|
||||
proxy.$modal.msgSuccess("删除成功")
|
||||
}).catch(() => { })
|
||||
}
|
||||
|
||||
/** 销售明细序号 */
|
||||
function rowDdSaleItemIndex({ row, rowIndex }) {
|
||||
row.index = rowIndex + 1
|
||||
}
|
||||
|
||||
/** 销售明细添加按钮操作 */
|
||||
function handleAddDdSaleItem() {
|
||||
let obj = {}
|
||||
obj.itemType = ""
|
||||
obj.itemCode = ""
|
||||
obj.qty = ""
|
||||
obj.unitPrice = ""
|
||||
obj.tankId = ""
|
||||
obj.bucketId = ""
|
||||
obj.rackId = ""
|
||||
ddSaleItemList.value.push(obj)
|
||||
}
|
||||
|
||||
/** 销售明细删除按钮操作 */
|
||||
function handleDeleteDdSaleItem() {
|
||||
if (checkedDdSaleItem.value.length == 0) {
|
||||
proxy.$modal.msgError("请先选择要删除的销售明细数据")
|
||||
} else {
|
||||
const ddSaleItems = ddSaleItemList.value
|
||||
const checkedDdSaleItems = checkedDdSaleItem.value
|
||||
ddSaleItemList.value = ddSaleItems.filter(function (item) {
|
||||
return checkedDdSaleItems.indexOf(item.index) == -1
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/** 复选框选中数据 */
|
||||
function handleDdSaleItemSelectionChange(selection) {
|
||||
checkedDdSaleItem.value = selection.map(item => item.index)
|
||||
}
|
||||
|
||||
/** 导出按钮操作 */
|
||||
function handleExport() {
|
||||
proxy.download('sale/sale/export', {
|
||||
...queryParams.value
|
||||
}, `sale_${new Date().getTime()}.xlsx`)
|
||||
}
|
||||
|
||||
getList()
|
||||
</script>
|
||||
534
src/views/frozen/sperm/index.vue
Normal file
534
src/views/frozen/sperm/index.vue
Normal file
@ -0,0 +1,534 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form-item label="冻精号" prop="code">
|
||||
<el-input v-model="queryParams.code" placeholder="请输入冻精号/公羊耳号" clearable @keyup.enter="handleQuery"
|
||||
style="width:150px;" />
|
||||
</el-form-item>
|
||||
<el-form-item label="冻精日期" style="width: 308px">
|
||||
<el-date-picker v-model="daterangeFreezeDt" type="daterange" range-separator="-" start-placeholder="开始日期"
|
||||
end-placeholder="结束日期" value-format="YYYY-MM-DD" clearable style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="技术员" prop="tech">
|
||||
<el-input v-model="queryParams.tech" placeholder="请输入技术员" clearable @keyup.enter="handleQuery"
|
||||
style="width:150px;" />
|
||||
</el-form-item>
|
||||
<el-form-item label="出库日期" style="width: 308px">
|
||||
<el-date-picker v-model="daterangeOutDt" type="daterange" range-separator="-" start-placeholder="开始日期"
|
||||
end-placeholder="结束日期" value-format="YYYY-MM-DD" clearable style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['sperm:sperm:add']">新增</el-button>
|
||||
</el-col>
|
||||
<!-- <el-col :span="1.5">
|
||||
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
|
||||
v-hasPermi="['sperm:sperm:edit']">修改</el-button>
|
||||
</el-col> -->
|
||||
<el-col :span="1.5">
|
||||
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
|
||||
v-hasPermi="['sperm:sperm:remove']">删除</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="warning" plain icon="Download" @click="handleExport"
|
||||
v-hasPermi="['sperm:sperm:export']">导出</el-button>
|
||||
</el-col>
|
||||
<el-button type="warning" plain icon="Close" @click="handleDiscard"
|
||||
v-hasPermi="['sperm:sperm:discard']">废弃</el-button>
|
||||
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="spermList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<!-- <el-table-column label="主键" align="center" prop="id" /> -->
|
||||
<el-table-column label="冻精号" align="center" prop="code" width="130px" fixed="fixed" />
|
||||
<el-table-column label="冻精日期" align="center" prop="freezeDt" width="130px">
|
||||
<template #default="scope">
|
||||
<span>{{ parseTime(scope.row.freezeDt, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="冻精品种" align="center" prop="breed" />
|
||||
<el-table-column label="生产批次" align="center" prop="batch" width="130px" />
|
||||
<el-table-column label="规格" align="center" prop="spec" />
|
||||
<el-table-column label="数量" align="center" prop="qty" sortable />
|
||||
<el-table-column label="是否性控" align="center">
|
||||
<template #default="scope">
|
||||
{{ scope.row.sexCtl === 1 ? '是' : '否' }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="状态" align="center" prop="stat" />
|
||||
<el-table-column label="技术员" align="center" prop="tech" />
|
||||
<el-table-column label="液氮罐ID" align="center" prop="tankId" />
|
||||
<el-table-column label="提桶ID" align="center" prop="bucketId" />
|
||||
<el-table-column label="冷冻架ID" align="center" prop="rackId" />
|
||||
<el-table-column label="出库日期" align="center" prop="outDt" width="130px">
|
||||
<template #default="scope">
|
||||
<span>{{ parseTime(scope.row.outDt, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="废弃原因" align="center" prop="discardTxt" />
|
||||
<el-table-column label="备注" align="center" prop="remark" />
|
||||
<el-table-column label="创建人" align="center" prop="createBy" />
|
||||
<el-table-column label="创建时间" align="center" prop="createTime" width="160px">
|
||||
<template #default="scope">
|
||||
{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}') }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right">
|
||||
<template #default="scope">
|
||||
<!-- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['sperm:sperm:edit']">修改</el-button> -->
|
||||
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
|
||||
v-hasPermi="['sperm:sperm:remove']">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
|
||||
v-model:limit="queryParams.pageSize" @pagination="getList" />
|
||||
|
||||
<!-- 添加或修改冻精库存对话框 -->
|
||||
<el-dialog :title="title" v-model="open" width="700px" append-to-body>
|
||||
<el-form ref="spermRef" :model="form" :rules="rules" label-width="100px">
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="冻精号" prop="code">
|
||||
<el-input v-model="form.code" placeholder="请输入冻精号/公羊耳号" clearable @blur="loadRamInfo" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="冻精日期" prop="freezeDt">
|
||||
<el-date-picker v-model="form.freezeDt" type="date" value-format="YYYY-MM-DD" placeholder="请选择冻精日期"
|
||||
style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="冻精品种" prop="breed">
|
||||
<el-input v-model="form.breed" :disabled="!!form.code" placeholder="自动回显" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="生产批次" prop="batch">
|
||||
<el-input v-model="form.batch" placeholder="请输入(例:20251107)" maxlength="8" show-word-limit />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="规格" prop="spec">
|
||||
<el-select v-model="form.spec" placeholder="请选择规格" clearable style="width: 100%">
|
||||
<el-option v-for="opt in SPEC_OPTS" :key="opt.value" :label="opt.label" :value="opt.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="数量" prop="qty">
|
||||
<el-select v-model="form.qty" filterable default-first-option placeholder="请选择数量" style="width: 100%">
|
||||
<el-option v-for="opt in QTY_OPTS" :key="opt.value" :label="opt.label" :value="opt.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="是否性控" prop="sexCtl">
|
||||
<el-select v-model="form.sexCtl" placeholder="请选择" clearable style="width: 100%">
|
||||
<el-option v-for="opt in SEX_CTL_OPTS" :key="opt.value" :label="opt.label" :value="opt.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="技术员" prop="tech">
|
||||
<el-input v-model="form.tech" placeholder="请输入技术员" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="液氮罐ID" prop="tankId">
|
||||
<el-select v-model="form.tankId" placeholder="请选择液氮罐" clearable style="width: 100%">
|
||||
<el-option v-for="opt in NUM_1_10" :key="opt.value" :label="opt.label" :value="opt.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="提桶ID" prop="bucketId">
|
||||
<el-select v-model="form.bucketId" placeholder="请选择提桶" clearable style="width: 100%">
|
||||
<el-option v-for="opt in NUM_1_10" :key="opt.value" :label="opt.label" :value="opt.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="冷冻架ID" prop="rackId">
|
||||
<el-select v-model="form.rackId" placeholder="请选择冷冻架" clearable style="width: 100%">
|
||||
<el-option v-for="opt in NUM_1_10" :key="opt.value" :label="opt.label" :value="opt.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="出库日期" prop="outDt">
|
||||
<el-date-picker v-model="form.outDt" type="date" value-format="YYYY-MM-DD" placeholder="请选择出库日期"
|
||||
style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24">
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model="form.remark" type="textarea" :rows="2" placeholder="请输入备注" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
|
||||
<div class="dialog-footer" style="text-align: right; margin-top: 10px;">
|
||||
<el-button type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
|
||||
<el-dialog title="批量废弃" v-model="discardOpen" width="400px" append-to-body>
|
||||
<el-form>
|
||||
<el-form-item label="冻精号(灰色为已废弃)">
|
||||
<el-tag v-for="s in discardDisabled" :key="'d-' + s.id"
|
||||
style="margin-right:4px;background:#f5f5f5;color:#909399;border:none;">{{ s.code }}</el-tag>
|
||||
|
||||
<el-tag v-for="s in discardSelection" :key="s.id" style="margin-right:4px;">{{ s.code }}</el-tag>
|
||||
|
||||
<span class="tag-count">已选 {{ discardSelection.length }} 个</span>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="废弃原因">
|
||||
<el-input v-model="discardReason" type="textarea" :rows="3" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<el-button @click="discardOpen = false">取消</el-button>
|
||||
<el-button type="primary" @click="submitDiscard">确定</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
<script setup name="Sperm">
|
||||
import { listSperm, getSperm, delSperm, addSperm, updateSperm } from "@/api/frozen/sperm"
|
||||
import request from '@/utils/request'
|
||||
const { proxy } = getCurrentInstance();
|
||||
|
||||
const spermList = ref([])
|
||||
const open = ref(false)
|
||||
const loading = ref(true)
|
||||
const showSearch = ref(true)
|
||||
const ids = ref([])
|
||||
const single = ref(true)
|
||||
const multiple = ref(true)
|
||||
const total = ref(0)
|
||||
const title = ref("")
|
||||
const daterangeFreezeDt = ref([]) // 冻精日期段
|
||||
const daterangeOutDt = ref([]) // 出库日期段
|
||||
const discardSelection = ref([]) // 可废弃(正常色)
|
||||
const discardDisabled = ref([]) // 已废弃(灰色)
|
||||
const discardReason = ref('')
|
||||
const discardOpen = ref(false)
|
||||
// 规格选项
|
||||
const SPEC_OPTS = [
|
||||
{ label: '0.25mL', value: '0.25mL' },
|
||||
{ label: '0.5mL', value: '0.5mL' }
|
||||
]
|
||||
|
||||
// 数量选项(1~200)
|
||||
const QTY_OPTS = Array.from({ length: 200 }, (_, i) => ({
|
||||
label: i + 1,
|
||||
value: i + 1
|
||||
}))
|
||||
|
||||
// 是否性控
|
||||
const SEX_CTL_OPTS = [
|
||||
{ label: '是', value: 1 },
|
||||
{ label: '否', value: 0 }
|
||||
]
|
||||
const NUM_1_10 = Array.from({ length: 10 }, (_, i) => ({
|
||||
label: i + 1 + '',
|
||||
value: i + 1
|
||||
}))
|
||||
const data = reactive({
|
||||
form: {},
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
code: null,
|
||||
tech: null
|
||||
},
|
||||
rules: {
|
||||
spec: [
|
||||
{ required: true, message: "请选择规格", trigger: "change" }
|
||||
],
|
||||
qty: [
|
||||
{ required: true, message: "请选择或输入数量", trigger: "blur" },
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
const num = Number(value)
|
||||
if (!Number.isInteger(num) || num < 1 || num > 200) {
|
||||
callback(new Error("数量必须为 1~200 的整数"))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
},
|
||||
trigger: "blur"
|
||||
}
|
||||
],
|
||||
sexCtl: [
|
||||
{ required: true, message: "请选择是否性控", trigger: "change" }
|
||||
],
|
||||
batch: [
|
||||
{ required: true, message: '生产批次不能为空', trigger: 'blur' },
|
||||
{
|
||||
pattern: /^\d{8}$/,
|
||||
message: '请输入 8 位日期(例:20251107)',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
code: [
|
||||
{ required: true, message: '请输入公羊耳号', trigger: 'blur' },
|
||||
{ validator: (_, v) => v && form.value.breed ? Promise.resolve() : Promise.reject('请先输入有效公羊耳号'), trigger: 'blur' }
|
||||
],
|
||||
freezeDt: [
|
||||
{ required: true, message: '请选择冻精日期', trigger: 'change' }
|
||||
],
|
||||
tech: [
|
||||
{ required: true, message: '请输入技术员', trigger: 'blur' }
|
||||
],
|
||||
tankId: [
|
||||
{ required: true, message: '请选择液氮罐', trigger: 'change' }
|
||||
],
|
||||
bucketId: [
|
||||
{ required: true, message: '请选择提桶', trigger: 'change' }
|
||||
],
|
||||
rackId: [
|
||||
{ required: true, message: '请选择冷冻架', trigger: 'change' }
|
||||
],
|
||||
outDt: [
|
||||
{ required: true, message: '请选择出库日期', trigger: 'change' }
|
||||
],
|
||||
}
|
||||
})
|
||||
|
||||
const { queryParams, form, rules } = toRefs(data)
|
||||
|
||||
/** 查询冻精库存列表 */
|
||||
function getList() {
|
||||
loading.value = true
|
||||
listSperm(queryParams.value).then(response => {
|
||||
spermList.value = response.rows
|
||||
total.value = response.total
|
||||
loading.value = false
|
||||
})
|
||||
}
|
||||
async function loadRamInfo() {
|
||||
if (!form.value.code) return
|
||||
const url = `/sheep/sheep/byManageTags/${form.value.code.trim()}`
|
||||
try {
|
||||
const { data } = await request.get(url)
|
||||
const sheep = data
|
||||
// ① 存在且未死亡
|
||||
if (sheep.statusId !== 1) {
|
||||
proxy.$modal.msgError('羊只不在群');
|
||||
form.value.code = '';
|
||||
form.value.breed = '';
|
||||
return;
|
||||
}
|
||||
// ② 性别=公羊
|
||||
if (sheep.gender !== 2) {
|
||||
proxy.$modal.msgError('该耳号对应不是公羊')
|
||||
form.value.code = ''
|
||||
form.value.breed = ''
|
||||
return
|
||||
}
|
||||
//回显品种
|
||||
form.value.breed = sheep.varietyName || ''
|
||||
proxy.$refs.spermRef.clearValidate('code')
|
||||
} catch (e) {
|
||||
console.log('>>> 请求失败:', e)
|
||||
proxy.$modal.msgError('未找到对应羊只')
|
||||
form.value.code = ''
|
||||
form.value.breed = ''
|
||||
}
|
||||
}
|
||||
// 取消按钮
|
||||
function cancel() {
|
||||
open.value = false
|
||||
reset()
|
||||
}
|
||||
|
||||
// 表单重置
|
||||
function reset() {
|
||||
form.value = {
|
||||
id: null,
|
||||
code: null,
|
||||
freezeDt: null,
|
||||
breed: null,
|
||||
batch: null,
|
||||
spec: null,
|
||||
qty: null,
|
||||
sexCtl: 0,
|
||||
stat: null,
|
||||
tech: null,
|
||||
tankId: null,
|
||||
bucketId: null,
|
||||
rackId: null,
|
||||
outDt: null,
|
||||
remark: null,
|
||||
createBy: null,
|
||||
createTime: null
|
||||
}
|
||||
proxy.resetForm("spermRef")
|
||||
}
|
||||
|
||||
/** 搜索按钮操作 */
|
||||
function handleQuery() {
|
||||
queryParams.value.pageNum = 1
|
||||
queryParams.value.params = queryParams.value.params || {}
|
||||
|
||||
// 冻精日期段
|
||||
if (daterangeFreezeDt.value && daterangeFreezeDt.value.length === 2) {
|
||||
queryParams.value.params.beginFreezeDt = daterangeFreezeDt.value[0]
|
||||
queryParams.value.params.endFreezeDt = daterangeFreezeDt.value[1]
|
||||
} else {
|
||||
delete queryParams.value.params.beginFreezeDt
|
||||
delete queryParams.value.params.endFreezeDt
|
||||
}
|
||||
|
||||
// 出库日期段
|
||||
if (daterangeOutDt.value && daterangeOutDt.value.length === 2) {
|
||||
queryParams.value.params.beginOutDt = daterangeOutDt.value[0]
|
||||
queryParams.value.params.endOutDt = daterangeOutDt.value[1]
|
||||
} else {
|
||||
delete queryParams.value.params.beginOutDt
|
||||
delete queryParams.value.params.endOutDt
|
||||
}
|
||||
|
||||
getList()
|
||||
}
|
||||
|
||||
/** 重置按钮操作 */
|
||||
function resetQuery() {
|
||||
daterangeFreezeDt.value = []
|
||||
daterangeOutDt.value = []
|
||||
proxy.resetForm('queryRef')
|
||||
handleQuery()
|
||||
}
|
||||
|
||||
// 多选框选中数据
|
||||
function handleSelectionChange(selection) {
|
||||
ids.value = selection.map(item => item.id)
|
||||
single.value = selection.length != 1
|
||||
multiple.value = !selection.length
|
||||
}
|
||||
|
||||
/** 新增按钮操作 */
|
||||
function handleAdd() {
|
||||
reset()
|
||||
open.value = true
|
||||
title.value = "添加冻精库存"
|
||||
}
|
||||
|
||||
/** 修改按钮操作 */
|
||||
function handleUpdate(row) {
|
||||
reset()
|
||||
const _id = row.id || ids.value
|
||||
getSperm(_id).then(response => {
|
||||
form.value = response.data
|
||||
open.value = true
|
||||
title.value = "修改冻精库存"
|
||||
})
|
||||
}
|
||||
|
||||
/** 提交按钮 */
|
||||
function submitForm() {
|
||||
proxy.$refs["spermRef"].validate(valid => {
|
||||
if (valid) {
|
||||
if (form.value.id != null) {
|
||||
updateSperm(form.value).then(response => {
|
||||
proxy.$modal.msgSuccess("修改成功")
|
||||
open.value = false
|
||||
getList()
|
||||
})
|
||||
} else {
|
||||
addSperm(form.value).then(response => {
|
||||
proxy.$modal.msgSuccess("新增成功")
|
||||
open.value = false
|
||||
getList()
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/** 删除按钮操作 */
|
||||
function handleDelete(row) {
|
||||
const _ids = row.id || ids.value
|
||||
proxy.$modal.confirm('是否确认删除冻精库存编号为"' + _ids + '"的数据项?').then(function () {
|
||||
return delSperm(_ids)
|
||||
}).then(() => {
|
||||
getList()
|
||||
proxy.$modal.msgSuccess("删除成功")
|
||||
}).catch(() => { })
|
||||
}
|
||||
|
||||
/** 导出按钮操作 */
|
||||
function handleExport() {
|
||||
proxy.download('sperm/sperm/export', {
|
||||
...queryParams.value
|
||||
}, `sperm_${new Date().getTime()}.xlsx`)
|
||||
}
|
||||
|
||||
// 废弃
|
||||
function handleDiscard() {
|
||||
if (!ids.value.length) return proxy.$modal.msgWarning('请选择记录')
|
||||
|
||||
const allSelected = spermList.value.filter(s => ids.value.includes(s.id))
|
||||
discardSelection.value = allSelected.filter(s => s.stat !== '废弃')
|
||||
discardDisabled.value = allSelected.filter(s => s.stat === '废弃')
|
||||
|
||||
if (!discardSelection.value.length) {
|
||||
proxy.$modal.msgWarning('所选记录已全部废弃')
|
||||
return
|
||||
}
|
||||
|
||||
discardReason.value = ''
|
||||
discardOpen.value = true
|
||||
}
|
||||
|
||||
function submitDiscard() {
|
||||
if (!discardReason.value.trim()) {
|
||||
proxy.$modal.msgWarning('请输入废弃原因')
|
||||
return
|
||||
}
|
||||
// 只提交未废弃的记录
|
||||
const data = discardSelection.value.map(s => ({
|
||||
id: s.id,
|
||||
discardTxt: discardReason.value
|
||||
}))
|
||||
request.put('/sperm/sperm/discard', data).then(() => {
|
||||
proxy.$modal.msgSuccess('废弃成功')
|
||||
discardOpen.value = false
|
||||
getList()
|
||||
})
|
||||
}
|
||||
getList()
|
||||
</script>
|
||||
<style scoped>
|
||||
.tag-count {
|
||||
color: #606266;
|
||||
background-color: #f5f7fa;
|
||||
padding: 2px 8px;
|
||||
border-radius: 12px;
|
||||
font-size: 12px;
|
||||
}
|
||||
</style>
|
||||
@ -18,7 +18,7 @@
|
||||
<el-option v-for="item in sheepfoldOptions" :key="item.id" :label="item.sheepfoldName" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="品种" prop="varietyId" style="width: 308px">
|
||||
<el-form-item label="品种" prop="varietyId">
|
||||
<el-select v-model="queryParams.varietyId" placeholder="请选择品种" style="min-width:150px" clearable>
|
||||
<el-option v-for="item in varietyOptions" :key="item.id" :label="item.variety" :value="item.id" />
|
||||
</el-select>
|
||||
@ -39,10 +39,10 @@
|
||||
<el-button type="primary" plain icon="Plus" @click="handleAdd"
|
||||
v-hasPermi="['body_measure:body_measure:add']">新增</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<!-- <el-col :span="1.5">
|
||||
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
|
||||
v-hasPermi="['body_measure:body_measure:edit']">修改</el-button>
|
||||
</el-col>
|
||||
</el-col> -->
|
||||
<el-col :span="1.5">
|
||||
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
|
||||
v-hasPermi="['body_measure:body_measure:remove']">删除</el-button>
|
||||
@ -56,284 +56,55 @@
|
||||
|
||||
<el-table v-loading="loading" :data="body_measureList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="管理耳号" align="center" prop="manageTags" min-width="100px" fixed />
|
||||
<el-table-column label="羊舍" align="center" prop="sheepfoldName" min-width="100px" />
|
||||
<el-table-column label="品种" align="center" prop="varietyName" />
|
||||
<el-table-column label="管理耳号" align="center" prop="manageTags" width="100" fixed />
|
||||
<el-table-column label="羊舍" align="center" prop="sheepfoldName" width="100" />
|
||||
<el-table-column label="品种" align="center" prop="varietyName" width="100" />
|
||||
<el-table-column label="事件类型" align="center" prop="eventType" width="120" />
|
||||
<el-table-column label="羊只类别" align="center" prop="sheepTypeName" />
|
||||
<el-table-column label="性别" align="center">
|
||||
<el-table-column label="羊只类别" align="center" prop="sheepTypeName" width="100" />
|
||||
<el-table-column label="性别" align="center" prop="gender" width="100">
|
||||
<template #default="scope">
|
||||
<span>{{ genderMap[scope.row.gender] || '未知' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="胎次" align="center" prop="parity">
|
||||
<template #header>
|
||||
<div style="display: flex; align-items: center; gap: 4px; cursor: pointer;" @click="handleSort('parity')">
|
||||
<span>胎次</span>
|
||||
<el-icon size="16" style="color: skyblue;">
|
||||
<ArrowUp v-if="!sortStates.parity.isSorting || sortStates.parity.isAsc" />
|
||||
<ArrowDown v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.parity }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="出生体重(kg)" align="center" prop="birthWeight" min-width="100px">
|
||||
<template #header>
|
||||
<div style="display: flex; align-items: center; gap: 4px; cursor: pointer;"
|
||||
@click="handleSort('birthWeight')">
|
||||
<span>出生体重(kg)</span>
|
||||
<el-icon size="16" style="color: skyblue;">
|
||||
<ArrowUp v-if="!sortStates.birthWeight.isSorting || sortStates.birthWeight.isAsc" />
|
||||
<ArrowDown v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.birthWeight }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="断奶体重(kg)" align="center" prop="weaningWeight" min-width="100px">
|
||||
<template #header>
|
||||
<div style="display: flex; align-items: center; gap: 4px; cursor: pointer;"
|
||||
@click="handleSort('weaningWeight')">
|
||||
<span>断奶体重(kg)</span>
|
||||
<el-icon size="16" style="color: skyblue;">
|
||||
<ArrowUp v-if="!sortStates.weaningWeight.isSorting || sortStates.weaningWeight.isAsc" />
|
||||
<ArrowDown v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.weaningWeight }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="当前体重(kg)" align="center" prop="currentWeight" min-width="100px">
|
||||
<template #header>
|
||||
<div style="display: flex; align-items: center; gap: 4px; cursor: pointer;"
|
||||
@click="handleSort('currentWeight')">
|
||||
<span>当前体重(kg)</span>
|
||||
<el-icon size="16" style="color: skyblue;">
|
||||
<ArrowUp v-if="!sortStates.currentWeight.isSorting || sortStates.currentWeight.isAsc" />
|
||||
<ArrowDown v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.currentWeight }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="体高" align="center" prop="height">
|
||||
<template #header>
|
||||
<div style="display: flex; align-items: center; gap: 4px; cursor: pointer;" @click="handleSort('height')">
|
||||
<span>体高</span>
|
||||
<el-icon size="16" style="color: skyblue;">
|
||||
<ArrowUp v-if="!sortStates.height.isSorting || sortStates.height.isAsc" />
|
||||
<ArrowDown v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.height }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="胸围" align="center" prop="bust">
|
||||
<template #header>
|
||||
<div style="display: flex; align-items: center; gap: 4px; cursor: pointer;" @click="handleSort('bust')">
|
||||
<span>胸围</span>
|
||||
<el-icon size="16" style="color: skyblue;">
|
||||
<ArrowUp v-if="!sortStates.bust.isSorting || sortStates.bust.isAsc" />
|
||||
<ArrowDown v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.bust }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="体斜长" align="center" prop="bodyLength">
|
||||
<template #header>
|
||||
<div style="display: flex; align-items: center; gap: 4px; cursor: pointer;" @click="handleSort('bodyLength')">
|
||||
<span>体斜长</span>
|
||||
<el-icon size="16" style="color: skyblue;">
|
||||
<ArrowUp v-if="!sortStates.bodyLength.isSorting || sortStates.bodyLength.isAsc" />
|
||||
<ArrowDown v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.bodyLength }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="管围" align="center" prop="pipeLength">
|
||||
<template #header>
|
||||
<div style="display: flex; align-items: center; gap: 4px; cursor: pointer;" @click="handleSort('pipeLength')">
|
||||
<span>管围</span>
|
||||
<el-icon size="16" style="color: skyblue;">
|
||||
<ArrowUp v-if="!sortStates.pipeLength.isSorting || sortStates.pipeLength.isAsc" />
|
||||
<ArrowDown v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.pipeLength }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="胸深" align="center" prop="chestDepth">
|
||||
<template #header>
|
||||
<div style="display: flex; align-items: center; gap: 4px; cursor: pointer;" @click="handleSort('chestDepth')">
|
||||
<span>胸深</span>
|
||||
<el-icon size="16" style="color: skyblue;">
|
||||
<ArrowUp v-if="!sortStates.chestDepth.isSorting || sortStates.chestDepth.isAsc" />
|
||||
<ArrowDown v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.chestDepth }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="臀高" align="center" prop="hipHeight">
|
||||
<template #header>
|
||||
<div style="display: flex; align-items: center; gap: 4px; cursor: pointer;" @click="handleSort('hipHeight')">
|
||||
<span>臀高</span>
|
||||
<el-icon size="16" style="color: skyblue;">
|
||||
<ArrowUp v-if="!sortStates.hipHeight.isSorting || sortStates.hipHeight.isAsc" />
|
||||
<ArrowDown v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.hipHeight }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="尻宽" align="center" prop="rumpWidth">
|
||||
<template #header>
|
||||
<div style="display: flex; align-items: center; gap: 4px; cursor: pointer;" @click="handleSort('rumpWidth')">
|
||||
<span>尻宽</span>
|
||||
<el-icon size="16" style="color: skyblue;">
|
||||
<ArrowUp v-if="!sortStates.rumpWidth.isSorting || sortStates.rumpWidth.isAsc" />
|
||||
<ArrowDown v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.rumpWidth }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="尻高" align="center" prop="rumpHeignt">
|
||||
<template #header>
|
||||
<div style="display: flex; align-items: center; gap: 4px; cursor: pointer;" @click="handleSort('rumpHeignt')">
|
||||
<span>尻高</span>
|
||||
<el-icon size="16" style="color: skyblue;">
|
||||
<ArrowUp v-if="!sortStates.rumpHeignt.isSorting || sortStates.rumpHeignt.isAsc" />
|
||||
<ArrowDown v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.rumpHeignt }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="腰角宽" align="center" prop="hipWidth">
|
||||
<template #header>
|
||||
<div style="display: flex; align-items: center; gap: 4px; cursor: pointer;" @click="handleSort('hipWidth')">
|
||||
<span>腰角宽</span>
|
||||
<el-icon size="16" style="color: skyblue;">
|
||||
<ArrowUp v-if="!sortStates.hipWidth.isSorting || sortStates.hipWidth.isAsc" />
|
||||
<ArrowDown v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.hipWidth }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="十字部高" align="center" prop="hipCrossHeight">
|
||||
<template #header>
|
||||
<div style="display: flex; align-items: center; gap: 4px; cursor: pointer;"
|
||||
@click="handleSort('hipCrossHeight')">
|
||||
<span>十字部高</span>
|
||||
<el-icon size="16" style="color: skyblue;">
|
||||
<ArrowUp v-if="!sortStates.hipCrossHeight.isSorting || sortStates.hipCrossHeight.isAsc" />
|
||||
<ArrowDown v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.hipCrossHeight }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="胎次" align="center" prop="parity" width="100" />
|
||||
<el-table-column label="出生体重(kg)" align="center" prop="birthWeight" width="150" sortable />
|
||||
<el-table-column label="断奶体重(kg)" align="center" prop="weaningWeight" width="150" sortable />
|
||||
<el-table-column label="当前体重(kg)" align="center" prop="currentWeight" width="150" sortable />
|
||||
<el-table-column label="体高" align="center" prop="height" width="100" sortable />
|
||||
<el-table-column label="胸围" align="center" prop="bust" width="100" sortable />
|
||||
<el-table-column label="体斜长" align="center" prop="bodyLength" width="150" sortable />
|
||||
<el-table-column label="管围" align="center" prop="pipeLength" width="100" sortable />
|
||||
<el-table-column label="胸深" align="center" prop="chestDepth" width="100" sortable />
|
||||
<el-table-column label="臀高" align="center" prop="hipHeight" width="100" sortable />
|
||||
<el-table-column label="尻宽" align="center" prop="rumpWidth" width="100" sortable />
|
||||
<el-table-column label="尻高" align="center" prop="rumpHeignt" width="100" sortable />
|
||||
<el-table-column label="腰角宽" align="center" prop="hipWidth" width="150" sortable />
|
||||
<el-table-column label="十字部高" align="center" prop="hipCrossHeight" width="150" sortable />
|
||||
<el-table-column label="繁育状态" align="center" prop="breedStatusName" width="100">
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.breedStatusName || '未设置' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="泌乳天数" align="center" prop="lactationDay" width="100">
|
||||
<template #header>
|
||||
<div style="display: flex; align-items: center; gap: 4px; cursor: pointer;"
|
||||
@click="handleSort('lactationDay')">
|
||||
<span>泌乳天数</span>
|
||||
<el-icon size="16" style="color: skyblue;">
|
||||
<ArrowUp v-if="!sortStates.lactationDay.isSorting || sortStates.lactationDay.isAsc" />
|
||||
<ArrowDown v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.lactationDay || '-' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="怀孕天数" align="center" prop="gestationDay" width="100">
|
||||
<template #header>
|
||||
<div style="display: flex; align-items: center; gap: 4px; cursor: pointer;"
|
||||
@click="handleSort('gestationDay')">
|
||||
<span>怀孕天数</span>
|
||||
<el-icon size="16" style="color: skyblue;">
|
||||
<ArrowUp v-if="!sortStates.gestationDay.isSorting || sortStates.gestationDay.isAsc" />
|
||||
<ArrowDown v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.gestationDay || '-' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="配后天数" align="center" prop="postMatingDay" width="100">
|
||||
<template #header>
|
||||
<div style="display: flex; align-items: center; gap: 4px; cursor: pointer;"
|
||||
@click="handleSort('postMatingDay')">
|
||||
<span>配后天数</span>
|
||||
<el-icon size="16" style="color: skyblue;">
|
||||
<ArrowUp v-if="!sortStates.postMatingDay.isSorting || sortStates.postMatingDay.isAsc" />
|
||||
<ArrowDown v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.postMatingDay || '-' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="备注" align="center" prop="comment" min-width="100px" />
|
||||
<el-table-column label="技术员" align="center" prop="technician" />
|
||||
<el-table-column label="泌乳天数" align="center" prop="lactationDay" width="150" sortable />
|
||||
<el-table-column label="怀孕天数" align="center" prop="gestationDay" width="150" sortable />
|
||||
<el-table-column label="配后天数" align="center" prop="postMatingDay" width="150" sortable />
|
||||
<el-table-column label="备注" align="center" prop="comment" width="100" />
|
||||
<el-table-column label="技术员" align="center" prop="technician" width="100" />
|
||||
<el-table-column label="测量日期" align="center" prop="measureDate" width="120">
|
||||
<template #default="scope">
|
||||
<span>{{ parseTime(scope.row.measureDate, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="创建人" align="center" prop="createBy" />
|
||||
<el-table-column label="创建人" align="center" prop="createBy" width="100" />
|
||||
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
|
||||
<template #default="scope">
|
||||
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" min-width="130px">
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" min-width="130">
|
||||
<template #default="scope">
|
||||
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['body_measure:body_measure:edit']">修改</el-button>
|
||||
<!-- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['body_measure:body_measure:edit']">修改</el-button> -->
|
||||
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
|
||||
v-hasPermi="['body_measure:body_measure:remove']">删除</el-button>
|
||||
</template>
|
||||
@ -372,10 +143,10 @@
|
||||
<el-form-item label="管围" prop="pipeLength">
|
||||
<el-input v-model="form.pipeLength" placeholder="请输入管围" :disabled="!isAdd" clearable />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="胸深" prop="chestDepth">
|
||||
<el-input v-model="form.chestDepth" placeholder="请输入胸深" :disabled="!isAdd" clearable />
|
||||
<el-form-item label="技术员" prop="technician">
|
||||
<el-input v-model="form.technician" placeholder="请输入技术员" :disabled="!isAdd" clearable />
|
||||
</el-form-item>
|
||||
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
@ -399,8 +170,8 @@
|
||||
<el-input v-model="form.hipCrossHeight" placeholder="请输入十字部高" :disabled="!isAdd" clearable />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="技术员" prop="technician">
|
||||
<el-input v-model="form.technician" placeholder="请输入技术员" :disabled="!isAdd" clearable />
|
||||
<el-form-item label="胸深" prop="chestDepth">
|
||||
<el-input v-model="form.chestDepth" placeholder="请输入胸深" :disabled="!isAdd" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
@ -426,7 +197,6 @@ import { getSheepByManageTags } from "@/api/produce/manage_sheep/changeVariety"
|
||||
import { listSheepfold_management as listSheepfold } from '@/api/fileManagement/sheepfold_management'
|
||||
import { getVarietyOptions } from '@/api/produce/other/fixHoof'
|
||||
import { getCurrentInstance } from 'vue'
|
||||
import { ArrowUp, ArrowDown } from '@element-plus/icons-vue'
|
||||
|
||||
const { proxy } = getCurrentInstance()
|
||||
|
||||
@ -478,19 +248,6 @@ const data = reactive({
|
||||
|
||||
const { queryParams, form, rules } = toRefs(data)
|
||||
|
||||
const [smFields, bsFields] = [
|
||||
// sc_body_measure 表字段
|
||||
['height', 'bust', 'bodyLength', 'pipeLength', 'chestDepth', 'hipHeight', 'rumpWidth', 'rumpHeignt', 'hipWidth', 'hipCrossHeight'],
|
||||
// bas_sheep 表字段
|
||||
['parity', 'birthWeight', 'weaningWeight', 'currentWeight', 'lactationDay', 'gestationDay', 'postMatingDay']
|
||||
];
|
||||
|
||||
// 排序状态
|
||||
const sortStates = reactive({
|
||||
...smFields.reduce((obj, field) => ({ ...obj, [field]: { isSorting: false, isAsc: true } }), {}),
|
||||
...bsFields.reduce((obj, field) => ({ ...obj, [field]: { isSorting: false, isAsc: true } }), {})
|
||||
});
|
||||
|
||||
//查询体尺测量列表
|
||||
function getList() {
|
||||
loading.value = true
|
||||
@ -510,23 +267,6 @@ function getList() {
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 通用排序方法(所有需要排序的列共用)
|
||||
* @param {String} prop - 排序字段
|
||||
*/
|
||||
function handleSort(prop) {
|
||||
Object.keys(sortStates).forEach(key => {
|
||||
sortStates[key].isSorting = false;
|
||||
});
|
||||
const current = sortStates[prop];
|
||||
current.isSorting = true;
|
||||
current.isAsc = !current.isAsc;
|
||||
queryParams.value.orderBy = prop;
|
||||
queryParams.value.sortDirection = current.isAsc ? 'ASC' : 'DESC';
|
||||
queryParams.value.pageNum = 1;
|
||||
getList();
|
||||
}
|
||||
|
||||
// 耳号脱焦验证
|
||||
function onManageTagsBlur() {
|
||||
const tag = form.value.manageTags?.trim();
|
||||
@ -597,12 +337,6 @@ function resetQuery() {
|
||||
data.varietyName = '';
|
||||
daterangeMeasureDate.value = [];
|
||||
proxy.resetForm("queryRef");
|
||||
Object.keys(sortStates).forEach(key => {
|
||||
sortStates[key].isSorting = false
|
||||
sortStates[key].isAsc = true
|
||||
})
|
||||
queryParams.value.orderBy = null;
|
||||
queryParams.value.sortDirection = null;
|
||||
handleQuery();
|
||||
}
|
||||
|
||||
|
||||
@ -1,10 +1,6 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<!-- <el-form-item label="创建时间" style="width: 308px">
|
||||
<el-date-picker v-model="daterangeCreateTime" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
|
||||
start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
|
||||
</el-form-item> -->
|
||||
<el-form-item label="事件日期" style="width: 308px">
|
||||
<el-date-picker v-model="daterangeDatetime" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
|
||||
start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
|
||||
@ -18,10 +14,6 @@
|
||||
<el-option v-for="item in varietyOptions" :key="item.id" :label="item.variety" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- <el-form-item label="体况评分" prop="score">
|
||||
<el-input v-model="queryParams.score" placeholder="请输入体况评分" clearable @keyup.enter="handleQuery"
|
||||
style="max-width: 150px;" />
|
||||
</el-form-item> -->
|
||||
<el-form-item label="羊舍" prop="sheepfold">
|
||||
<el-select v-model="queryParams.sheepfold" placeholder="请选择羊舍" style="min-width:150px" clearable>
|
||||
<el-option v-for="item in sheepfoldOptions" :key="item.id" :label="item.sheepfoldName" :value="item.id" />
|
||||
@ -63,20 +55,7 @@
|
||||
<span>{{ parseTime(scope.row.datetime, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="体况评分" align="center" prop="score" min-width="100px">
|
||||
<template #header>
|
||||
<div style="display: flex; align-items: center; gap: 8px; cursor: pointer;" @click="handleScoreSort">
|
||||
<span>体况评分</span>
|
||||
<el-icon size="16" style="color: skyblue;">
|
||||
<ArrowUp v-if="!sortByScore || sortScoreAsc" />
|
||||
<ArrowDown v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.score }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="体况评分" align="center" prop="score" min-width="100px" sortable/>
|
||||
<el-table-column label="羊舍" align="center" prop="sheepfoldName" min-width="100px" />
|
||||
<el-table-column label="备注" align="center" prop="comment" min-width="130px" />
|
||||
<el-table-column label="技术员" align="center" prop="technician" />
|
||||
@ -141,7 +120,6 @@ import { listBody_score, getBody_score, delBody_score, addBody_score, updateBody
|
||||
import { listSheepfold_management as listSheepfold } from '@/api/fileManagement/sheepfold_management'
|
||||
import { checkSheepByManageTags, getVarietyOptions } from "@/api/produce/other/fixHoof"
|
||||
import { getCurrentInstance, ref, reactive, toRefs } from 'vue'
|
||||
import { ArrowUp, ArrowDown } from '@element-plus/icons-vue'
|
||||
|
||||
const { proxy } = getCurrentInstance()
|
||||
|
||||
@ -158,8 +136,6 @@ const daterangeDatetime = ref([])
|
||||
const daterangeCreateTime = ref([])
|
||||
const sheepfoldList = ref([])
|
||||
const isAdd = ref(false)
|
||||
const sortByScore = ref(false)
|
||||
const sortScoreAsc = ref(true)
|
||||
|
||||
const data = reactive({
|
||||
form: {
|
||||
@ -210,13 +186,6 @@ function getList() {
|
||||
queryParams.value.params["beginCreateTime"] = daterangeCreateTime.value[0]
|
||||
queryParams.value.params["endCreateTime"] = daterangeCreateTime.value[1]
|
||||
}
|
||||
if (sortByScore.value) {
|
||||
queryParams.value.orderBy = "score";
|
||||
queryParams.value.sortDirection = sortScoreAsc.value ? "ASC" : "DESC";
|
||||
} else {
|
||||
queryParams.value.orderBy = null;
|
||||
queryParams.value.sortDirection = null;
|
||||
}
|
||||
listBody_score(queryParams.value).then(response => {
|
||||
body_scoreList.value = response.rows
|
||||
total.value = response.total
|
||||
@ -254,18 +223,6 @@ function onManageTagsBlur() {
|
||||
});
|
||||
}
|
||||
|
||||
//体况评分排序
|
||||
function handleScoreSort() {
|
||||
if (sortByScore.value) {
|
||||
sortScoreAsc.value = !sortScoreAsc.value;
|
||||
} else {
|
||||
sortByScore.value = true;
|
||||
sortScoreAsc.value = true;
|
||||
}
|
||||
queryParams.value.pageNum = 1;
|
||||
getList();
|
||||
}
|
||||
|
||||
//加载羊舍数据
|
||||
const sheepfoldOptions = ref([])
|
||||
function getSheepfoldOptions() {
|
||||
@ -308,8 +265,6 @@ function resetQuery() {
|
||||
daterangeCreateTime.value = []
|
||||
queryParams.value.varietyId = null;
|
||||
proxy.resetForm("queryRef")
|
||||
sortByScore.value = false;
|
||||
sortScoreAsc.value = true;
|
||||
handleQuery()
|
||||
}
|
||||
|
||||
|
||||
@ -59,51 +59,12 @@
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="羊舍" align="center" prop="sheepfoldName" min-width="120px" />
|
||||
<el-table-column label="乳房深度" align="center" prop="depth">
|
||||
<template #header>
|
||||
<div style="display: flex; align-items: center; gap: 4px; cursor: pointer;" @click="handleDepthSort">
|
||||
<span>乳房深度</span>
|
||||
<el-icon size="16" style="color: #409EFF;">
|
||||
<ArrowUp v-if="!sortByDepth || sortDepthAsc" />
|
||||
<ArrowDown v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.depth }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="乳房长度" align="center" prop="length">
|
||||
<template #header>
|
||||
<div style="display: flex; align-items: center; gap: 4px; cursor: pointer;" @click="handleLengthSort">
|
||||
<span>乳房长度</span>
|
||||
<el-icon size="16" style="color: #409EFF;">
|
||||
<ArrowUp v-if="!sortByLength || sortLengthAsc" />
|
||||
<ArrowDown v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.length }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="乳房深度" align="center" prop="depth" min-width="150px" sortable />
|
||||
<el-table-column label="乳房长度" align="center" prop="length" min-width="150px" sortable />
|
||||
<el-table-column label="乳房位置" align="center" prop="position" />
|
||||
<el-table-column label="乳房附着" align="center" prop="adbere" />
|
||||
<el-table-column label="乳房间隔度" align="center" prop="spacing" min-width="120px" />
|
||||
<el-table-column label="乳房评分" align="center" prop="score">
|
||||
<template #header>
|
||||
<div style="display: flex; align-items: center; gap: 4px; cursor: pointer;" @click="handleScoreSort">
|
||||
<span>乳房评分</span>
|
||||
<el-icon size="16" style="color: #409EFF;">
|
||||
<ArrowUp v-if="!sortByScore || sortScoreAsc" />
|
||||
<ArrowDown v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.score }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="乳房评分" align="center" prop="score" min-width="150px" sortable />
|
||||
<el-table-column label="备注" align="center" prop="comment" />
|
||||
<el-table-column label="技术员" align="center" prop="technician" />
|
||||
<el-table-column label="创建人" align="center" prop="createBy" />
|
||||
@ -177,7 +138,6 @@ import { listBreast_rating, getBreast_rating, delBreast_rating, addBreast_rating
|
||||
import { checkSheepByManageTags, getVarietyOptions } from "@/api/produce/other/fixHoof"
|
||||
import { listSheepfold_management as listSheepfold } from '@/api/fileManagement/sheepfold_management'
|
||||
import { getCurrentInstance, reactive, ref } from "vue"
|
||||
import { ArrowUp, ArrowDown } from '@element-plus/icons-vue'
|
||||
|
||||
const { proxy } = getCurrentInstance()
|
||||
|
||||
@ -193,15 +153,7 @@ const title = ref("")
|
||||
const daterangeCreateTime = ref([])
|
||||
const daterangeEventDate = ref([]);
|
||||
const isAdd = ref(false)
|
||||
// 乳房深度排序
|
||||
const sortByDepth = ref(false)
|
||||
const sortDepthAsc = ref(true)
|
||||
// 乳房长度排序
|
||||
const sortByLength = ref(false)
|
||||
const sortLengthAsc = ref(true)
|
||||
// 乳房评分排序
|
||||
const sortByScore = ref(false)
|
||||
const sortScoreAsc = ref(true)
|
||||
|
||||
const data = reactive({
|
||||
form: {
|
||||
id: null,
|
||||
@ -251,19 +203,6 @@ function getList() {
|
||||
queryParams.value.params["beginCreateTime"] = daterangeCreateTime.value[0]
|
||||
queryParams.value.params["endCreateTime"] = daterangeCreateTime.value[1]
|
||||
}
|
||||
if (sortByDepth.value) {
|
||||
queryParams.value.orderBy = "depth";
|
||||
queryParams.value.sortDirection = sortDepthAsc.value ? "ASC" : "DESC";
|
||||
} else if (sortByLength.value) {
|
||||
queryParams.value.orderBy = "length";
|
||||
queryParams.value.sortDirection = sortLengthAsc.value ? "ASC" : "DESC";
|
||||
} else if (sortByScore.value) {
|
||||
queryParams.value.orderBy = "score";
|
||||
queryParams.value.sortDirection = sortScoreAsc.value ? "ASC" : "DESC";
|
||||
} else {
|
||||
queryParams.value.orderBy = null;
|
||||
queryParams.value.sortDirection = null;
|
||||
}
|
||||
|
||||
listBreast_rating(queryParams.value).then(response => {
|
||||
breast_ratingList.value = response.rows
|
||||
@ -296,49 +235,6 @@ function onManageTagsBlur() {
|
||||
form.value.comment = null;
|
||||
});
|
||||
}
|
||||
//乳房深度排序
|
||||
function handleDepthSort() {
|
||||
console.log("sortByDepth before:", sortByDepth.value);
|
||||
sortByLength.value = false;
|
||||
sortByScore.value = false;
|
||||
if (sortByDepth.value) {
|
||||
sortDepthAsc.value = !sortDepthAsc.value;
|
||||
} else {
|
||||
sortByDepth.value = true;
|
||||
sortDepthAsc.value = true;
|
||||
}
|
||||
queryParams.value.pageNum = 1;
|
||||
console.log("sortByDepth after:", sortByDepth.value);
|
||||
getList();
|
||||
}
|
||||
|
||||
//乳头长度排序
|
||||
function handleLengthSort() {
|
||||
sortByDepth.value = false;
|
||||
sortByScore.value = false;
|
||||
if (sortByLength.value) {
|
||||
sortLengthAsc.value = !sortLengthAsc.value;
|
||||
} else {
|
||||
sortByLength.value = true;
|
||||
sortLengthAsc.value = true;
|
||||
}
|
||||
queryParams.value.pageNum = 1;
|
||||
getList();
|
||||
}
|
||||
|
||||
//乳况评分排序
|
||||
function handleScoreSort() {
|
||||
sortByDepth.value = false;
|
||||
sortByLength.value = false;
|
||||
if (sortByScore.value) {
|
||||
sortScoreAsc.value = !sortScoreAsc.value;
|
||||
} else {
|
||||
sortByScore.value = true;
|
||||
sortScoreAsc.value = true;
|
||||
}
|
||||
queryParams.value.pageNum = 1;
|
||||
getList();
|
||||
}
|
||||
|
||||
// 取消按钮
|
||||
function cancel() {
|
||||
@ -377,12 +273,6 @@ function resetQuery() {
|
||||
daterangeCreateTime.value = []
|
||||
daterangeEventDate.value = [];
|
||||
proxy.resetForm("queryRef")
|
||||
sortByDepth.value = false
|
||||
sortByLength.value = false
|
||||
sortByScore.value = false
|
||||
sortDepthAsc.value = true
|
||||
sortLengthAsc.value = true
|
||||
sortScoreAsc.value = true
|
||||
handleQuery()
|
||||
}
|
||||
|
||||
|
||||
@ -57,10 +57,10 @@
|
||||
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="customerList" @selection-change="handleSelectionChange">
|
||||
<el-table v-loading="loading" :data="customerList" @selection-change="handleSelectionChange" @sort-change="handleSortChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="客户名称" align="center" prop="name" />
|
||||
<el-table-column label="客户电话" align="center" prop="phone" />
|
||||
<el-table-column label="客户电话" align="center" prop="phone" sortable="custom" />
|
||||
<el-table-column label="客户地址" align="center">
|
||||
<template #default="scope">
|
||||
{{ scope.row.province }}{{ scope.row.city }}{{ scope.row.district }}{{ scope.row.address }}
|
||||
@ -80,10 +80,10 @@
|
||||
:total="total"
|
||||
v-model:page="queryParams.pageNum"
|
||||
v-model:limit="queryParams.pageSize"
|
||||
:page-sizes="[20, 50, 100, 200, 500, 1000, 2000]"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
<!-- 添加或修改客户管理对话框 -->
|
||||
<el-dialog :title="title" v-model="open" width="700px" append-to-body>
|
||||
<el-form ref="customerRef" :model="form" :rules="rules" label-width="80px">
|
||||
<el-form-item label="客户名称" prop="name">
|
||||
@ -120,7 +120,7 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, getCurrentInstance, onMounted } from 'vue'
|
||||
import { ref, reactive, getCurrentInstance, onMounted, toRefs } from 'vue'
|
||||
import { listCustomer, getCustomer, delCustomer, addCustomer, updateCustomer } from "@/api/sale/customer/customer"
|
||||
import { regionData } from 'element-china-area-data'
|
||||
|
||||
@ -149,8 +149,10 @@ const data = reactive({
|
||||
form: {},
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
pageSize: 20, // 默认为20
|
||||
name: null,
|
||||
orderByColumn: null, // 增加排序字段
|
||||
isAsc: null // 增加排序方式
|
||||
},
|
||||
rules: {
|
||||
name: [{ required: true, message: "客户名称不能为空", trigger: "blur" }],
|
||||
@ -173,6 +175,13 @@ function getList() {
|
||||
})
|
||||
}
|
||||
|
||||
// 处理排序变化
|
||||
function handleSortChange({ column, prop, order }) {
|
||||
queryParams.value.orderByColumn = prop
|
||||
queryParams.value.isAsc = order === 'ascending' ? 'asc' : 'desc'
|
||||
getList()
|
||||
}
|
||||
|
||||
function cancel() {
|
||||
open.value = false
|
||||
reset()
|
||||
@ -200,6 +209,10 @@ function handleQuery() {
|
||||
|
||||
function resetQuery() {
|
||||
proxy.resetForm("queryRef")
|
||||
// 重置时也要清空排序
|
||||
queryParams.value.orderByColumn = null
|
||||
queryParams.value.isAsc = null
|
||||
// 如果el-table需要清除UI上的排序图标,可调用clearSort,此处简化处理
|
||||
handleQuery()
|
||||
}
|
||||
|
||||
|
||||
@ -1,27 +1,15 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<!-- 面包屑导航 -->
|
||||
<el-breadcrumb separator="/" class="breadcrumb">
|
||||
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
|
||||
<el-breadcrumb-item>销售管理</el-breadcrumb-item>
|
||||
<el-breadcrumb-item>销售记录</el-breadcrumb-item>
|
||||
</el-breadcrumb>
|
||||
|
||||
<!-- 搜索区域 -->
|
||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form-item label="耳号" prop="bsManageTags">
|
||||
<el-input
|
||||
v-model="queryParams.bsManageTags"
|
||||
placeholder="请输入耳号"
|
||||
clearable
|
||||
size="small"
|
||||
@keyup.enter="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="销售日期" prop="saleDate">
|
||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="88px">
|
||||
<el-form-item label="销售日期">
|
||||
<el-date-picker
|
||||
v-model="queryParams.saleDate"
|
||||
v-model="dateRange"
|
||||
type="daterange"
|
||||
range-separator="至"
|
||||
start-placeholder="开始日期"
|
||||
@ -31,15 +19,24 @@
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="销售类别" prop="saleType">
|
||||
<el-select v-model="queryParams.saleType" clearable placeholder="请选择" size="small" style="width: 180px">
|
||||
<el-option
|
||||
v-for="d in saleTypeOptions"
|
||||
:key="d.dictValue"
|
||||
:label="d.dictLabel"
|
||||
:value="d.dictValue"
|
||||
<el-form-item label="客户名称" prop="customerName">
|
||||
<el-input
|
||||
v-model="queryParams.customerName"
|
||||
placeholder="请输入客户名称"
|
||||
clearable
|
||||
size="small"
|
||||
@keyup.enter="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="销售人员" prop="salesPersonName">
|
||||
<el-input
|
||||
v-model="queryParams.salesPersonName"
|
||||
placeholder="请输入销售人员姓名"
|
||||
clearable
|
||||
size="small"
|
||||
@keyup.enter="handleQuery"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item>
|
||||
@ -48,7 +45,6 @@
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<!-- 操作按钮区域 -->
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
@ -92,16 +88,31 @@
|
||||
v-hasPermi="['saleRecord:saleRecord:export']"
|
||||
>导出</el-button>
|
||||
</el-col>
|
||||
<!-- 修复:使用 v-model:showSearch 替代 :showSearch.sync -->
|
||||
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" />
|
||||
</el-row>
|
||||
|
||||
<!-- 表格区域 -->
|
||||
<el-table v-loading="loading" :data="saleRecordList" @selection-change="handleSelectionChange" style="width: 100%">
|
||||
<el-table
|
||||
v-loading="loading"
|
||||
:data="saleRecordList"
|
||||
@selection-change="handleSelectionChange"
|
||||
@sort-change="handleSortChange"
|
||||
style="width: 100%"
|
||||
>
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="序号" type="index" width="50" align="center" />
|
||||
|
||||
<el-table-column label="耳号" align="center" prop="bsManageTags" width="120" show-overflow-tooltip />
|
||||
<el-table-column label="品种" align="center" prop="variety" width="100" show-overflow-tooltip />
|
||||
|
||||
<el-table-column
|
||||
label="羊舍"
|
||||
align="center"
|
||||
prop="sheepfoldId"
|
||||
width="120"
|
||||
:formatter="sheepfoldFormat"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
|
||||
<el-table-column label="事件类型" align="center" prop="eventType" width="100" show-overflow-tooltip />
|
||||
<el-table-column label="销售日期" align="center" prop="saleDate" width="120">
|
||||
<template #default="scope">
|
||||
@ -110,34 +121,37 @@
|
||||
</el-table-column>
|
||||
<el-table-column label="羊只类别" align="center" prop="sheepName" width="100" show-overflow-tooltip />
|
||||
<el-table-column label="性别" align="center" prop="gender" width="80" />
|
||||
<el-table-column label="月龄" align="center" prop="monthAge" width="80" />
|
||||
<el-table-column label="胎次" align="center" prop="parity" width="80" />
|
||||
|
||||
<el-table-column label="月龄" align="center" prop="monthAge" width="80" sortable="custom" />
|
||||
<el-table-column label="胎次" align="center" prop="parity" width="80" sortable="custom" />
|
||||
<el-table-column label="计价方式" align="center" prop="pricingMethod" width="100" show-overflow-tooltip />
|
||||
<el-table-column label="单价" align="center" prop="unitPrice" width="100">
|
||||
|
||||
<el-table-column label="单价" align="center" prop="unitPrice" width="100" sortable="custom">
|
||||
<template #default="scope">
|
||||
<span v-if="scope.row.unitPrice !== null && scope.row.unitPrice !== undefined">{{ scope.row.unitPrice }}元</span>
|
||||
<span v-if="scope.row.unitPrice !== null">{{ scope.row.unitPrice }}元</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="总价" align="center" prop="totalPrice" width="100">
|
||||
<el-table-column label="总价" align="center" prop="totalPrice" width="100" sortable="custom">
|
||||
<template #default="scope">
|
||||
<span v-if="scope.row.totalPrice !== null && scope.row.totalPrice !== undefined">{{ scope.row.totalPrice }}元</span>
|
||||
<span v-if="scope.row.totalPrice !== null">{{ scope.row.totalPrice }}元</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="总体重" align="center" prop="totalWeight" width="100">
|
||||
<el-table-column label="总体重" align="center" prop="totalWeight" width="100" sortable="custom">
|
||||
<template #default="scope">
|
||||
<span v-if="scope.row.totalWeight">{{ scope.row.totalWeight }}kg</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="平均体重" align="center" prop="avgWeight" width="100">
|
||||
<el-table-column label="平均体重" align="center" prop="avgWeight" width="100" sortable="custom">
|
||||
<template #default="scope">
|
||||
<span v-if="scope.row.avgWeight">{{ scope.row.avgWeight }}kg</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="平均单只价格" align="center" prop="avgPricePerSheep" width="120">
|
||||
<el-table-column label="平均单只价格" align="center" prop="avgPricePerSheep" width="120" sortable="custom">
|
||||
<template #default="scope">
|
||||
<span v-if="scope.row.avgPricePerSheep">{{ scope.row.avgPricePerSheep }}元</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="销售类别" align="center" prop="saleType" width="120" :formatter="saleTypeFormat" show-overflow-tooltip />
|
||||
<el-table-column label="客户名称" align="center" prop="customerName" width="140" show-overflow-tooltip />
|
||||
<el-table-column label="客户电话" align="center" prop="customerPhone" width="130" show-overflow-tooltip />
|
||||
@ -147,12 +161,13 @@
|
||||
<el-table-column label="审批编号" align="center" prop="approvalNo" width="130" show-overflow-tooltip />
|
||||
<el-table-column label="疾病类型" align="center" prop="diseaseType" width="120" :formatter="diseaseTypeFormat" show-overflow-tooltip />
|
||||
<el-table-column label="次要原因" align="center" prop="secondaryReason" width="120" show-overflow-tooltip />
|
||||
<el-table-column label="羊舍" align="center" prop="sheepfoldName" width="120" show-overflow-tooltip />
|
||||
<el-table-column label="班组" align="center" prop="groupCode" width="100" :formatter="groupFormat" />
|
||||
<el-table-column label="繁育状态" align="center" prop="breed" width="100" show-overflow-tooltip />
|
||||
<el-table-column label="产后天数" align="center" prop="postLambingDay" width="90" />
|
||||
<el-table-column label="泌乳天数" align="center" prop="lactationDay" width="90" />
|
||||
<el-table-column label="怀孕天数" align="center" prop="lambingDay" width="90" />
|
||||
|
||||
<el-table-column label="产后天数" align="center" prop="postLambingDay" width="90" sortable="custom" />
|
||||
<el-table-column label="泌乳天数" align="center" prop="lactationDay" width="90" sortable="custom" />
|
||||
<el-table-column label="怀孕天数" align="center" prop="lambingDay" width="90" sortable="custom" />
|
||||
|
||||
<el-table-column label="创建人" align="center" prop="createdByName" width="120" show-overflow-tooltip />
|
||||
<el-table-column label="创建日期" align="center" prop="createdAt" width="120">
|
||||
<template #default="scope">
|
||||
@ -187,11 +202,10 @@
|
||||
:total="total"
|
||||
:page="queryParams.pageNum"
|
||||
:limit="queryParams.pageSize"
|
||||
:page-sizes="[20, 50, 100, 200, 500, 1000, 2000]"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
<!-- 添加或修改羊只销售记录对话框 -->
|
||||
<!-- 修复:使用 v-model 替代 :visible.sync -->
|
||||
<el-dialog :title="title" v-model="open" width="1200px" append-to-body>
|
||||
<el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
|
||||
<el-row :gutter="20">
|
||||
@ -213,10 +227,8 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="耳号" prop="bsManageTagsList">
|
||||
<!-- 通过 allow-create + 回车新增耳号,使用 watch 捕捉新增项并拉取详情 -->
|
||||
<el-select
|
||||
v-model="form.bsManageTagsList"
|
||||
multiple
|
||||
@ -236,238 +248,9 @@
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<!-- 自动填充展示 -->
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="8"><el-form-item label="品种">{{ form.variety }}</el-form-item></el-col>
|
||||
<el-col :span="8"><el-form-item label="羊只类别">{{ form.sheepName }}</el-form-item></el-col>
|
||||
<el-col :span="8"><el-form-item label="性别">{{ form.gender }}</el-form-item></el-col>
|
||||
<el-col :span="8"><el-form-item label="月龄">{{ form.monthAge }}</el-form-item></el-col>
|
||||
<el-col :span="8"><el-form-item label="胎次">{{ form.parity }}</el-form-item></el-col>
|
||||
<el-col :span="8"><el-form-item label="繁育状态">{{ form.breed }}</el-form-item></el-col>
|
||||
<el-col :span="8"><el-form-item label="产后天数">{{ form.postLambingDay }}</el-form-item></el-col>
|
||||
<el-col :span="8"><el-form-item label="泌乳天数">{{ form.lactationDay }}</el-form-item></el-col>
|
||||
<el-col :span="8"><el-form-item label="怀孕天数">{{ form.lambingDay }}</el-form-item></el-col>
|
||||
</el-row>
|
||||
|
||||
<el-divider />
|
||||
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="8">
|
||||
<el-form-item label="事件类型" prop="eventType">
|
||||
<el-input v-model="form.eventType" placeholder="默认为销售" readonly />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="8">
|
||||
<el-form-item label="销售日期" prop="saleDate">
|
||||
<el-date-picker
|
||||
v-model="form.saleDate"
|
||||
type="date"
|
||||
placeholder="选择日期"
|
||||
value-format="yyyy-MM-dd"
|
||||
style="width: 100%"
|
||||
:disabled-date="disabledDate"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="8">
|
||||
<el-form-item label="计价方式" prop="pricingMethod">
|
||||
<el-select
|
||||
v-model="form.pricingMethod"
|
||||
placeholder="请选择计价方式"
|
||||
@change="handlePricingMethodChange"
|
||||
style="width: 100%"
|
||||
>
|
||||
<el-option label="按个体" value="按个体" />
|
||||
<el-option label="按体重" value="按体重" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<!-- 动态字段:按个体 -->
|
||||
<template v-if="form.pricingMethod === '按个体'">
|
||||
<el-col :span="8">
|
||||
<el-form-item label="单价(元/只)" prop="unitPrice">
|
||||
<el-input v-model="form.unitPrice" placeholder="请输入单价" @input="calculateIndividualPrice">
|
||||
<template #append>元</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="总价" prop="totalPrice">
|
||||
<el-input v-model="form.totalPrice" placeholder="自动计算" readonly>
|
||||
<template #append>元</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</template>
|
||||
|
||||
<!-- 动态字段:按体重 -->
|
||||
<template v-if="form.pricingMethod === '按体重'">
|
||||
<el-col :span="8">
|
||||
<el-form-item label="总重量" prop="totalWeight">
|
||||
<el-input v-model="form.totalWeight" placeholder="请输入总重量" @input="calculateWeightPrice">
|
||||
<template #append>kg</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="单价(元/kg)" prop="unitPrice">
|
||||
<el-input v-model="form.unitPrice" placeholder="请输入单价" @input="calculateWeightPrice">
|
||||
<template #append>元</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="总价" prop="totalPrice">
|
||||
<el-input v-model="form.totalPrice" placeholder="自动计算" readonly>
|
||||
<template #append>元</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="平均体重">
|
||||
<el-input v-model="form.avgWeight" placeholder="自动计算" readonly>
|
||||
<template #append>kg</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="平均单只价格">
|
||||
<el-input v-model="form.avgPricePerSheep" placeholder="自动计算" readonly>
|
||||
<template #append>元</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</template>
|
||||
</el-row>
|
||||
|
||||
<el-divider />
|
||||
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="销售类别" prop="saleType">
|
||||
<el-select
|
||||
v-model="form.saleType"
|
||||
placeholder="请选择销售类别"
|
||||
@change="handleSaleTypeChange"
|
||||
style="width: 100%"
|
||||
>
|
||||
<el-option
|
||||
v-for="dict in saleTypeOptions"
|
||||
:key="dict.dictValue"
|
||||
:label="dict.dictLabel"
|
||||
:value="dict.dictValue"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="客户名称" prop="customerId">
|
||||
<el-select
|
||||
v-model="form.customerId"
|
||||
filterable
|
||||
remote
|
||||
reserve-keyword
|
||||
placeholder="请输入客户名称"
|
||||
:remote-method="remoteMethodGetCustomer"
|
||||
:loading="customerLoading"
|
||||
@change="handleCustomerChange"
|
||||
style="width: 100%"
|
||||
>
|
||||
<!-- 使用 sx_customer.name 作为显示字段 -->
|
||||
<el-option
|
||||
v-for="item in customerOptions"
|
||||
:key="item.id"
|
||||
:label="item.name"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<!-- 淘汰相关:仅在 销售类别=淘汰销售/淘汰屠宰 时显示 -->
|
||||
<template v-if="isEliminationSale">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="疾病类型" prop="diseaseType">
|
||||
<el-select v-model="form.diseaseType" placeholder="请选择疾病类型" @change="handleDiseaseTypeChange" style="width: 100%">
|
||||
<el-option
|
||||
v-for="dict in diseaseTypeOptions"
|
||||
:key="dict.dictValue"
|
||||
:label="dict.dictLabel"
|
||||
:value="dict.dictValue"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="班组" prop="groupCode">
|
||||
<el-select v-model="form.groupCode" placeholder="请选择班组" style="width: 100%">
|
||||
<el-option
|
||||
v-for="dict in groupOptions"
|
||||
:key="dict.dictValue"
|
||||
:label="dict.dictLabel"
|
||||
:value="dict.dictValue"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12" v-if="diseaseTypeLabel === '病残羊'">
|
||||
<el-form-item label="次要原因" prop="secondaryReason">
|
||||
<el-input v-model="form.secondaryReason" placeholder="请输入次要原因" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</template>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="销售人员" prop="salesPersonId">
|
||||
<el-select v-model="form.salesPersonId" placeholder="请选择销售人员" style="width: 100%">
|
||||
<el-option v-for="user in userOptions" :key="user.userId" :label="user.nickName" :value="user.userId" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="检疫证号" prop="quarantineNo">
|
||||
<el-input v-model="form.quarantineNo" placeholder="请输入检疫证号" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="审批编号" prop="approvalNo">
|
||||
<el-input v-model="form.approvalNo" placeholder="请输入审批编号" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="技术员" prop="technicianId">
|
||||
<el-select v-model="form.technicianId" placeholder="请选择技术员" style="width: 100%">
|
||||
<el-option v-for="user in userOptions" :key="user.userId" :label="user.nickName" :value="user.userId" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="处理人" prop="handlerId">
|
||||
<el-select v-model="form.handlerId" placeholder="请选择处理人" style="width: 100%">
|
||||
<el-option v-for="user in userOptions" :key="user.userId" :label="user.nickName" :value="user.userId" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24">
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" :rows="2" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button type="primary" @click="submitForm">确 定</el-button>
|
||||
@ -496,7 +279,6 @@ export default {
|
||||
name: 'SxSheepSale',
|
||||
data() {
|
||||
return {
|
||||
// 通用
|
||||
loading: true,
|
||||
ids: [],
|
||||
single: true,
|
||||
@ -506,37 +288,27 @@ export default {
|
||||
saleRecordList: [],
|
||||
title: '',
|
||||
open: false,
|
||||
|
||||
// 查询
|
||||
dateRange: [],
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
bsManageTags: null,
|
||||
sheepfoldId: null,
|
||||
saleDate: null,
|
||||
saleType: null,
|
||||
pageSize: 20,
|
||||
customerName: null,
|
||||
salesPersonName: null,
|
||||
orderByColumn: null,
|
||||
isAsc: null
|
||||
},
|
||||
|
||||
// 表单
|
||||
form: {},
|
||||
|
||||
// 字典
|
||||
saleTypeOptions: [],
|
||||
diseaseTypeOptions: [],
|
||||
groupOptions: [],
|
||||
|
||||
// 下拉数据
|
||||
sheepfoldOptions: [],
|
||||
earTagOptions: [],
|
||||
userOptions: [],
|
||||
customerOptions: [],
|
||||
customerLoading: false,
|
||||
|
||||
// 耳号变更侦听缓存
|
||||
_prevTags: [],
|
||||
|
||||
// 校验规则(包含动态必填的自自定义 validator)
|
||||
rules: {
|
||||
// ... rules 保持不变 ...
|
||||
sheepfoldId: [{ required: true, message: '羊舍不能为空', trigger: 'change' }],
|
||||
bsManageTagsList: [{ type: 'array', required: true, message: '至少需要一个耳号', trigger: 'change' }],
|
||||
saleDate: [{ required: true, message: '销售日期不能为空', trigger: 'change' }],
|
||||
@ -545,38 +317,11 @@ export default {
|
||||
saleType: [{ required: true, message: '销售类别不能为空', trigger: 'change' }],
|
||||
customerId: [{ required: true, message: '客户不能为空', trigger: 'change' }],
|
||||
salesPersonId: [{ required: true, message: '销售人员不能为空', trigger: 'change' }],
|
||||
diseaseType: [
|
||||
{
|
||||
validator: (rule, val, cb) => {
|
||||
if (this.isEliminationSale && !val) return cb(new Error('淘汰销售必须选择疾病类型'))
|
||||
cb()
|
||||
},
|
||||
trigger: 'change',
|
||||
},
|
||||
],
|
||||
groupCode: [
|
||||
{
|
||||
validator: (rule, val, cb) => {
|
||||
if (this.isEliminationSale && !val) return cb(new Error('淘汰销售必须选择班组'))
|
||||
cb()
|
||||
},
|
||||
trigger: 'change',
|
||||
},
|
||||
],
|
||||
secondaryReason: [
|
||||
{
|
||||
validator: (rule, val, cb) => {
|
||||
if (this.diseaseTypeLabel === '病残羊' && !val) return cb(new Error('疾病类型为病残羊时必须填写次要原因'))
|
||||
cb()
|
||||
},
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
// ...
|
||||
},
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
// 根据"标签(label)"判断淘汰类,避免 dictValue 不一致导致判断失效
|
||||
isEliminationSale() {
|
||||
const opt = this.saleTypeOptions.find(o => o.dictValue === this.form.saleType)
|
||||
const label = opt ? opt.dictLabel : ''
|
||||
@ -588,7 +333,6 @@ export default {
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
// 监听耳号多选变化:只对"新添加"的耳号拉取一次详情
|
||||
'form.bsManageTagsList'(val = []) {
|
||||
const added = Array.isArray(val) ? val.filter(v => !this._prevTags.includes(v)) : []
|
||||
if (added.length > 0) {
|
||||
@ -596,7 +340,6 @@ export default {
|
||||
}
|
||||
this._prevTags = Array.isArray(val) ? [...val] : []
|
||||
|
||||
// 计价联动
|
||||
if (this.form.pricingMethod === '按个体') {
|
||||
this.calculateIndividualPrice()
|
||||
} else if (this.form.pricingMethod === '按体重') {
|
||||
@ -619,18 +362,24 @@ export default {
|
||||
this.getDictsData()
|
||||
this.getSheepfoldOptions()
|
||||
this.getUserOptions()
|
||||
this.remoteMethodGetCustomer('') // 初始化客户列表
|
||||
this.remoteMethodGetCustomer('')
|
||||
},
|
||||
methods: {
|
||||
/** 禁用未来日期 */
|
||||
disabledDate(time) {
|
||||
return time.getTime() > Date.now()
|
||||
},
|
||||
|
||||
/** 查询列表 */
|
||||
getList() {
|
||||
this.loading = true
|
||||
listSaleRecord(this.queryParams)
|
||||
const params = { ...this.queryParams }
|
||||
if (this.dateRange && this.dateRange.length === 2) {
|
||||
params.params = {
|
||||
beginSaleDate: this.dateRange[0],
|
||||
endSaleDate: this.dateRange[1]
|
||||
}
|
||||
}
|
||||
|
||||
listSaleRecord(params)
|
||||
.then(res => {
|
||||
this.saleRecordList = res.rows || []
|
||||
this.total = res.total || 0
|
||||
@ -638,7 +387,26 @@ export default {
|
||||
.finally(() => (this.loading = false))
|
||||
},
|
||||
|
||||
// 字典翻译
|
||||
handleSortChange({ column, prop, order }) {
|
||||
this.queryParams.orderByColumn = prop
|
||||
this.queryParams.isAsc = order === 'ascending' ? 'asc' : 'desc'
|
||||
this.getList()
|
||||
},
|
||||
|
||||
// 【核心修改】前端格式化方法:将 sheepfoldId 转换为 名称
|
||||
sheepfoldFormat(row) {
|
||||
if (!row.sheepfoldId) return '';
|
||||
// 在 sheepfoldOptions 中查找
|
||||
// 兼容可能的数据结构:id/name 或 sheepfoldId/sheepfoldName
|
||||
const found = this.sheepfoldOptions.find(item =>
|
||||
(item.id == row.sheepfoldId) || (item.sheepfoldId == row.sheepfoldId)
|
||||
);
|
||||
if (found) {
|
||||
return found.sheepfoldName || found.name;
|
||||
}
|
||||
return row.sheepfoldId; // 如果没找到,显示 ID
|
||||
},
|
||||
|
||||
saleTypeFormat(row) {
|
||||
return this.selectDictLabel(this.saleTypeOptions, row.saleType)
|
||||
},
|
||||
@ -649,34 +417,35 @@ export default {
|
||||
return this.selectDictLabel(this.groupOptions, row.groupCode)
|
||||
},
|
||||
|
||||
// 顶部搜索
|
||||
handleQuery() {
|
||||
this.queryParams.pageNum = 1
|
||||
this.getList()
|
||||
},
|
||||
resetQuery() {
|
||||
this.dateRange = []
|
||||
this.resetForm('queryForm')
|
||||
this.queryParams.orderByColumn = null
|
||||
this.queryParams.isAsc = null
|
||||
if (this.$refs.table) {
|
||||
this.$refs.table.clearSort()
|
||||
}
|
||||
this.handleQuery()
|
||||
},
|
||||
|
||||
// 选择行
|
||||
handleSelectionChange(selection) {
|
||||
this.ids = selection.map(item => item.id)
|
||||
this.single = selection.length !== 1
|
||||
this.multiple = !selection.length
|
||||
},
|
||||
|
||||
// 新增
|
||||
handleAdd() {
|
||||
this.reset()
|
||||
this.open = true
|
||||
this.title = '添加羊只销售记录'
|
||||
this.form.eventType = '销售'
|
||||
// 设置销售日期默认值为今天 (保持与 value-format="yyyy-MM-dd" 一致的字符串格式)
|
||||
this.form.saleDate = new Date().toISOString().slice(0, 10)
|
||||
},
|
||||
|
||||
// 修改
|
||||
handleUpdate(row) {
|
||||
this.reset()
|
||||
const id = row.id || this.ids
|
||||
@ -691,13 +460,11 @@ export default {
|
||||
})
|
||||
},
|
||||
|
||||
// 取消
|
||||
cancel() {
|
||||
this.open = false
|
||||
this.reset()
|
||||
},
|
||||
|
||||
// 重置
|
||||
reset() {
|
||||
this.form = {
|
||||
id: null,
|
||||
@ -746,19 +513,14 @@ export default {
|
||||
this.resetForm('formRef')
|
||||
},
|
||||
|
||||
/** 提交 */
|
||||
submitForm() {
|
||||
this.$refs.formRef.validate(valid => {
|
||||
if (!valid) return
|
||||
|
||||
// 耳号数组 → 逗号串
|
||||
if (Array.isArray(this.form.bsManageTagsList) && this.form.bsManageTagsList.length > 0) {
|
||||
this.form.bsManageTags = this.form.bsManageTagsList.join(',')
|
||||
} else {
|
||||
this.form.bsManageTags = null
|
||||
}
|
||||
|
||||
// 由后端设置 createdBy / createdAt,更稳妥
|
||||
const api = this.form.id ? updateSaleRecord : addSaleRecord
|
||||
api(this.form)
|
||||
.then(() => {
|
||||
@ -767,12 +529,11 @@ export default {
|
||||
this.getList()
|
||||
})
|
||||
.catch(err => {
|
||||
this.$modal.msgError((this.form.id ? '修改失败:' : '新增失败:') + (err.message || '未知错误'))
|
||||
console.error(err)
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
/** 删除 */
|
||||
handleDelete(row) {
|
||||
const ids = row.id || this.ids
|
||||
this.$modal.confirm('是否确认删除羊只销售记录编号为"' + ids + '"的数据项?')
|
||||
@ -784,35 +545,37 @@ export default {
|
||||
.catch(() => {})
|
||||
},
|
||||
|
||||
/** 导出 */
|
||||
handleExport() {
|
||||
this.$modal.confirm('是否确认导出所有羊只销售记录数据项?').then(() => {
|
||||
this.download('/saleRecord/saleRecord/export', { ...this.queryParams }, `saleRecord_${new Date().getTime()}.xlsx`)
|
||||
const params = { ...this.queryParams }
|
||||
if (this.dateRange && this.dateRange.length === 2) {
|
||||
params.params = {
|
||||
beginSaleDate: this.dateRange[0],
|
||||
endSaleDate: this.dateRange[1]
|
||||
}
|
||||
}
|
||||
this.download('/saleRecord/saleRecord/export', params, `saleRecord_${new Date().getTime()}.xlsx`)
|
||||
})
|
||||
},
|
||||
|
||||
/** 字典数据(注意 disease_type) */
|
||||
getDictsData() {
|
||||
getDicts('sale_type').then(r => (this.saleTypeOptions = r.data || []))
|
||||
getDicts('disease_type').then(r => (this.diseaseTypeOptions = r.data || []))
|
||||
getDicts('group').then(r => (this.groupOptions = r.data || []))
|
||||
},
|
||||
|
||||
/** 羊舍下拉 */
|
||||
getSheepfoldOptions() {
|
||||
listSheepfold_management().then(r => {
|
||||
this.sheepfoldOptions = r.rows || r.data || []
|
||||
})
|
||||
},
|
||||
|
||||
/** 用户下拉(销售人员、技术员、处理人) */
|
||||
getUserOptions() {
|
||||
listUser().then(r => {
|
||||
this.userOptions = r.rows || r.data || []
|
||||
})
|
||||
},
|
||||
|
||||
/** 客户远程搜索:使用 sx_customer.name 字段 */
|
||||
remoteMethodGetCustomer(query) {
|
||||
this.customerLoading = true
|
||||
const p = query ? { name: query } : {}
|
||||
@ -823,31 +586,24 @@ export default {
|
||||
.finally(() => (this.customerLoading = false))
|
||||
},
|
||||
|
||||
/** 客户选择后回填 name/phone/address 到表单 */
|
||||
handleCustomerChange(customerId) {
|
||||
const customer = this.customerOptions.find(item => item.id === customerId)
|
||||
if (customer) {
|
||||
this.form.customerName = customer.name
|
||||
this.form.customerPhone = customer.phone
|
||||
this.form.customerAddress = customer.address
|
||||
} else {
|
||||
this.form.customerName = null
|
||||
this.form.customerPhone = null
|
||||
this.form.customerAddress = null
|
||||
}
|
||||
},
|
||||
|
||||
/** 羊舍改变:加载耳号(此处示例,替换成你的真实接口) */
|
||||
handleSheepfoldChange(sheepfoldId) {
|
||||
this.form.bsManageTagsList = []
|
||||
this.earTagOptions = []
|
||||
// TODO: 替换为真实接口 getEarTagsBySheepfold(sheepfoldId)
|
||||
if (sheepfoldId) {
|
||||
// 模拟数据或根据羊舍加载真实耳号
|
||||
this.earTagOptions = ['1001', '1002', '1003', '1004', '1005']
|
||||
}
|
||||
},
|
||||
|
||||
/** 根据耳号查羊只信息 */
|
||||
fetchSheepInfo(bsManageTags) {
|
||||
if (!bsManageTags) return
|
||||
getSheepInfo(bsManageTags).then(response => {
|
||||
@ -872,7 +628,6 @@ export default {
|
||||
})
|
||||
},
|
||||
|
||||
/** 计价方式切换 */
|
||||
handlePricingMethodChange(method) {
|
||||
if (method === '按个体') {
|
||||
this.form.totalWeight = null
|
||||
@ -883,7 +638,6 @@ export default {
|
||||
}
|
||||
},
|
||||
|
||||
/** 按个体计价 */
|
||||
calculateIndividualPrice() {
|
||||
if (this.form.pricingMethod !== '按个体') return
|
||||
const unitPrice = parseFloat(this.form.unitPrice) || 0
|
||||
@ -893,7 +647,6 @@ export default {
|
||||
this.form.avgPricePerSheep = Number.isFinite(unitPrice) ? Number(unitPrice.toFixed(2)) : 0
|
||||
},
|
||||
|
||||
/** 按体重计价 */
|
||||
calculateWeightPrice() {
|
||||
if (this.form.pricingMethod !== '按体重') return
|
||||
const unitPrice = parseFloat(this.form.unitPrice) || 0
|
||||
@ -907,7 +660,6 @@ export default {
|
||||
this.form.avgPricePerSheep = Number.isFinite(avgP) ? Number(avgP.toFixed(2)) : 0
|
||||
},
|
||||
|
||||
/** 销售类别变化:清理并重新校验 */
|
||||
handleSaleTypeChange() {
|
||||
if (!this.isEliminationSale) {
|
||||
this.form.diseaseType = null
|
||||
@ -919,7 +671,6 @@ export default {
|
||||
})
|
||||
},
|
||||
|
||||
/** 疾病类型变化:联动"次要原因" */
|
||||
handleDiseaseTypeChange() {
|
||||
if (this.diseaseTypeLabel !== '病残羊') {
|
||||
this.form.secondaryReason = null
|
||||
|
||||
154
vite.config.js.timestamp-1764732862738-8d090efb34fca.mjs
Normal file
154
vite.config.js.timestamp-1764732862738-8d090efb34fca.mjs
Normal file
File diff suppressed because one or more lines are too long
Loading…
x
Reference in New Issue
Block a user