2025-09-01 16:05:31 +08:00

853 lines
20 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="order-detail-container">
<!-- 基础信息区域 -->
<view class="info-section">
<uni-row class="info-grid">
<uni-col class="flex-row">
<view class="label">生产单位: </view>
<uni-data-select
v-model="form.companyId"
:localdata="companyOptions"
text-field="deptName"
value-field="deptId"
@change="getEdu"
:clear="true"
/>
</uni-col>
</uni-row>
<uni-row class="info-grid">
<uni-col :span="12">
<view class="label">剩余金额:{{ remainingMoney}}</view>
</uni-col>
<uni-col :span="12">
<view class="label">订单金额:{{ orderAmount }}</view>
</uni-col>
</uni-row>
<uni-row class="info-grid">
<uni-col :span="24" style="display: flex;">
<view class="label">已选补差:</view>
<view class="">
<view style="color: red;" v-if="buchaGoodsList.length&&selectedBuCha.length==0">
提示:当前有补差数据可选择
</view>
<view v-else class="" v-for="(item,index) in selectedBuCha" :key="index">
商品{{item.goodsname}},金额{{item.piaokou}}
</view>
</view>
</uni-col>
</uni-row>
<button type="primary" @click="toShowBucha" v-show="buChaButState">选择补差</button>
</view>
<!-- 补差列表 -->
<view class="" v-if="ShowBucha">
<!-- 商品信息区域 -->
<view class="goods-section">
<view class="section-title">
<view class="">
补差商品信息
</view>
<view class="select-all">
<checkbox
:checked="allSelected"
@click="toggleSelectAll"
></checkbox>
</view>
</view>
<view v-if="buchaGoodsList.length === 0" class="no-data">
暂无商品数据
</view>
<view v-else class="goods-double-column">
<checkbox-group @change="checkboxChange">
<view
v-for="(goods, index) in buchaGoodsList"
:key="goods.piaokouid"
class="goods-item"
>
<view class="goods-header">
<text class="serial-number">{{ index + 1 }}</text>
<text class="goods-name">{{ goods.goodsname }}</text>
<checkbox :checked="selectedList.includes(goods.piaokouid)" :value="goods.piaokouid">
</checkbox>
</view>
<view class="goods-content">
<uni-row class="info-row">
<uni-col :span="12" class="info-pair">
<view class="label">申请日期:{{ goods.applydate }}</view>
</uni-col>
<uni-col :span="12" class="info-pair">
<view class="label">补差类型:{{ goods.piaokoutype }}</view>
</uni-col>
</uni-row>
<uni-row class="info-row">
<uni-col :span="12" class="info-pair">
<view class="label">商品简称:{{ goods.shortname }}</view>
</uni-col>
<uni-col :span="12" class="info-pair">
<view class="label">可补差金额:{{ goods.piaokou }}</view>
</uni-col>
</uni-row>
</view>
</view>
</checkbox-group>
</view>
</view>
<!-- 操作按钮 -->
<view class="action-buttons">
<button @click="goAdd" class="btn btn-secondary">添加</button>
<button @click="goCancel" class="btn btn-primary">取消</button>
</view>
</view>
<view v-else>
<!-- 商品信息区域 -->
<view class="goods-section">
<view class="section-title">
<view class="">
商品信息
</view>
</view>
<view v-if="goodsList.length === 0" class="no-data">
暂无商品数据
</view>
<view v-else class="goods-double-column">
<view
v-for="(goods, index) in goodsList"
:key="goods.goodsid"
class="goods-item"
>
<view class="goods-header">
<text class="serial-number">{{ index + 1 }}</text>
<text class="goods-name">{{ goods.goodsname }}</text>
</view>
<view class="goods-content">
<uni-row class="info-row">
<uni-col :span="12" class="info-pair">
<view class="label">件装数:{{ goods.packingnum }}</view>
</uni-col>
<uni-col :span="12" class="info-pair">
<view class="label">供应参考价:{{ goods.invoiceprice }}</view>
</uni-col>
</uni-row>
<uni-row class="info-row">
<uni-col :span="12" class="info-pair">
<view class="label">前三月平均数:{{ goods.threeMonths }}</view>
</uni-col>
<uni-col :span="12" class="info-pair">
<view class="label">使用票扣:{{ goods.piaokou }}</view>
</uni-col>
</uni-row>
<uni-row class="info-row">
<uni-col :span="12" class="info-pair">
<view class="label">小计:{{ goods.allmoney }}</view>
</uni-col>
<uni-col :span="12" class="info-pair">
<view class="label">税率:{{ goods.taxrate }}</view>
</uni-col>
</uni-row>
<uni-row class="info-row">
<uni-col :span="12" class="info-pair flex-row" >
<view class="label">采购数量:</view>
<input
class="uni-input custom-input"
v-model="goods.goodsnum"
placeholder="请输入采购数量"
@confirm="e =>handleInput(e,index)"/>
</uni-col>
</uni-row>
</view>
</view>
</view>
</view>
<!-- 操作按钮 -->
<view class="action-buttons">
<button @click="goSave" class="btn btn-secondary">保存</button>
<button @click="goSubmit" class="btn btn-primary">确认提交</button>
</view>
</view>
</view>
</template>
<script setup>
import { addsalemain } from '../../../../api/orderManager/index.js'
import { getsalemaincheckAmount } from '../../../../api/orderManager/index.js'
import { onMounted, ref ,computed} from 'vue'
import { contractData, goodsData } from '../detailData.js'
import { listsaleBusGoodsList } from '../../../../api/orderManager/index.js'
import { listproductList } from '../../../../api/orderManager/index.js'
// import { getInfo } from '../../../../store/modules/user.js'
import { useUserStore } from '../../../../store/modules/user.js'
import data1 from './data1.js'
//已选补差
const selectedBuCha = ref([])
// 商品列表数据
const buchaGoodsList =ref([])
const goodsList = ref([])
const form = ref({
companyId:1,
})
const RemainingMoney = ref('0.00') // 剩余金额
//显示补差按钮
const buChaButState = ref(true)
//显示选中所有按钮
const allSelected = ref(false)
//储存选中的列表
const selectedList = ref([])
//显示补差
const ShowBucha = ref(false)
//剩余金额
const remainingMoney = ref(0)
//订单金额
const orderAmount = ref(0.00)
// 入参
const queryNum = ref({})
// 基础信息
const contract = ref({})
// 生产单位
const companyOptions = ref([])
const monthOptions = ref([
{ value: 0, text: '本月执行' },
{ value: 1, text: '下月执行' }
])
// // 通用的金额格式化函数
// const formatMoney = (value) => {
// const num = Number(value)
// return isNaN(num)
// ? '0.00'
// : num.toLocaleString('en-US', {
// minimumFractionDigits: 2,
// maximumFractionDigits: 2
// })
// }
// // 创建计算属性(可选)
// const formattedRemainingMoney = computed(() => formatMoney(RemainingMoney.value))
// const formattedContractMoney = computed(() => formatMoney(form.value.contractmoney))
onMounted(() => {
// contract.value = contractData.data[0]
// console.log(contract.value)
getEdu()
getsalemainpiAoKouList()
getDeptLists()
GetlistsaleBusGoodsList()
})
// 获取补差,票扣列表数据
function getsalemainpiAoKouList() {
const body = {
companyId:form.value.companyId,
}
buchaGoodsList.value = data1.data
// salemainpiAoKouList(body).then(res => {
// BuChatableData.value = res.data
// });
}
function GetlistsaleBusGoodsList() {
// // 查询可销售商品列表
const KeSaleGoodsParams ={
companyId:form.value.companyId,
// userid: useUserStore.id,暂时替换为41
userid: 41,
deleteflag:0, //不禁用的,禁用标志 0: 不禁用 1: 禁用 2, 流程中
// state:1, //状态0待审核,1已审核
}
const KeSaleGoodsQuery = {
pageNum: 1,
pageSize: 999,
}
listsaleBusGoodsList(KeSaleGoodsParams,KeSaleGoodsQuery).then(res => {
goodsList.value = res.data
});
}
const getDeptLists = () =>{
listproductList().then(res => {
companyOptions.value = res.data.map(item => {
return {
value:item.deptId,
text:item.deptName
}
})
console.log('companyOptions.value', companyOptions.value)
});
}
/**
* 判断两个数组是否**严格相等**(顺序、值、类型都一致)
*/
function arraysEqual(a, b) {
return (
Array.isArray(a) &&
Array.isArray(b) &&
a.length === b.length &&
a.every((val, idx) => val === b[idx])
);
}
// 操作方法
const checkboxChange = (value) =>{
// console.log("value",value)
let idList = value.detail.value
let compareList = []
selectedList.value = idList//对比列表
selectedBuCha.value = []
let temp =true
idList.forEach(item =>{
buchaGoodsList.value.forEach(item1 =>{
if( temp ){
compareList.push(item1.piaokouid)
}
if(item1.piaokouid == item){
selectedBuCha.value.push(
{ goodsname: item1.goodsname,
piaokou: item1.piaokou,
goodsid:item1.goodsid}
)
}
})
temp =false
}
)
//判断是否全选中
console.log("111",arraysEqual(idList,compareList))
console.log("111",idList,compareList)
if(compareList.length!==0&&idList.length!==0&&arraysEqual(idList,compareList)){
allSelected.value = true
}else{
allSelected.value = false
}
}
/** 更改生产单位时,查询额度 */
function getEdu() {
console.log(form.value.companyId,'form.value.companyId生产单位ID')
// 清空已选补差数据
const AmountqueryParams = {
companyId:form.value.companyId,
saleId: 0,
}
// 查询剩余额度
getsalemaincheckAmount(AmountqueryParams).then(res => {
remainingMoney.value = res.data.amounts
});
GetlistsaleBusGoodsList()
getsalemainpiAoKouList()
}
//选择所有列表
const toggleSelectAll = () =>{
if(!allSelected.value){
selectedList.value = buchaGoodsList.value.map(item => item.piaokouid)
allSelected.value = true
selectedBuCha.value = []
buchaGoodsList.value.forEach(item1 =>{
selectedBuCha.value.push(
{ goodsname: item1.goodsname,
piaokou: item1.piaokou,
goodsid:item1.goodsid}
)
})
}else{
selectedBuCha.value = []//清除已补差数据
selectedList.value = []//清除已选中
allSelected.value = false
}
console.log("value",selectedList.value)
console.log("value",allSelected.value)
}
//添加
const goAdd = () =>{
console.log('添加!')
//算出每个药品的总piaokou
console.log('selectedBuCha.value',selectedBuCha.value)
if(selectedBuCha.value.length!==0){
const piaoKouSum = selectedBuCha.value.reduce((acc , cur) =>{
acc[cur.goodsid] = (acc[cur.goodsid]||0) + cur.piaokou
return acc
},{})
console.log('piaoKouSum',piaoKouSum)
goodsList.value.forEach( item =>{
if(piaoKouSum[item.goodsid] !== undefined){
item.piaokou = piaoKouSum[item.goodsid]
}
})
}else{
uni.showToast({
title: '没有选择数据!',
icon: 'none',
duration: 2000
});
return
}
uni.showToast({
title: '添加成功!',
icon: 'success',
duration: 2000
});
window.scrollTo({ top: 0, behavior: 'smooth' });
ShowBucha.value = false
buChaButState.value =true
}
//取消
const goCancel = () =>{
ShowBucha.value = false
buChaButState.value =true
window.scrollTo({ top: 0, behavior: 'smooth' });
console.log('取消!')
}
// 计算小计
const handleInput = (e, index) => {
console.log('index',index)
const value = e.detail.value
// 将输入值转为数字
const num = Number(value)
if (isNaN(num)) return // 防止非数字输入
// 更新采购数量
goodsList.value[index].goodsnum = num
// 重新计算小计 = 采购数量 × 供应参考价
goodsList.value[index].allmoney = Math.ceil(num * goodsList.value[index].invoiceprice*100)/100
//计算订单金额
orderAmount.value = 0
goodsList.value.forEach(item =>{
orderAmount.value += Number(item.invoiceprice)*Number(item.goodsnum)
} )
orderAmount.value = Math.ceil(orderAmount.value * 100) / 100;
console.log('orderAmount',orderAmount.value)
}
const toggleSelection = (index) => {
goodsList.value[index].selected = !goodsList.value[index].selected;
}
const handleByCompany = (value) => {
console.log("value", value)
// 更新数据
}
const validatePiaokou = () => {
// 找出所有piaokou大于xiaoji的商品
const invalidItems = form.value.saledetailList.filter(
item => item.piaokou > item.xiaoji
);
if (invalidItems.length > 0) {
// 构建错误提示信息
const errorMessage = `以下商品的票扣金额大于小计金额:\n` +
invalidItems.map(item =>
`- ${item.goodsname} (票扣: ${item.piaokou}, 小计: ${item.xiaoji})`
).join('\n');
uni.showToast({
title: errorMessage,
icon: 'none',
duration: 3000
});
return false;
}
return true;
};
const goSave = () => {
console.log("回退操作")
// 成功提示 (类似 ElMessage.success)
const tableData =goodsList.value;
const filteredData = tableData.filter(item =>
item.goodsnum !== null &&
item.goodsnum !== '' &&
item.goodsnum !== 0 &&
!isNaN(item.goodsnum)
);
form.value.saledetailList = filteredData
form.value.saledetailList = form.value.saledetailList.map(item => ({
...item,
price:item.invoiceprice,
xiaoji:item.allmoney
}));
// 添加验证
if (!validatePiaokou()) {
return; // 验证不通过,停止执行
}
form.value.state = 0 // 0为保存可修改编辑1的时候为提交
addsalemain(form.value).then(res => {
uni.showToast({
title: '保存成功!',
icon: 'success',
duration: 2000
});
uni.navigateTo({
url:'/pages/work/OrderManager/index'
})
})
//提交
console.log(" form.value.state", form.value)
}
const goSubmit = () => {
console.log("审核操作")
const tableData =goodsList.value;
const filteredData = tableData.filter(item =>
item.goodsnum !== null &&
item.goodsnum !== '' &&
item.goodsnum !== 0 &&
!isNaN(item.goodsnum)
);
form.value.saledetailList = filteredData
form.value.saledetailList = form.value.saledetailList.map(item => ({
...item,
price:item.invoiceprice,
xiaoji:item.allmoney
}));
// 添加验证
if (!validatePiaokou()) {
return; // 验证不通过,停止执行
}
form.value.state = 1 // 0为保存可修改编辑1的时候为提交
addsalemain(form.value).then(res => {
uni.showToast({
title: '提交成功!',
icon: 'success',
duration: 2000
});
uni.navigateTo({
url:'/pages/work/OrderManager/index'
})
})
}
const toShowBucha = () => {
ShowBucha.value = true
buChaButState.value =false
console.log("选择补差")
}
</script>
<style lang="scss" scoped>
// ::v-deep .uni-checkbox-input {
// background-color: #fff !important;
// border-color: #67c23a !important;
// }
// ::v-deep .uni-checkbox-input-checked {
// background-color: #fff !important;
// color: #67c23a !important; /* 对号颜色 */
// }
// ::v-deep .uni-checkbox-input svg{
// viewBox: 0 0 36 36;
// width: 22rpx;
// height: 22rpx;
// }
.select-all {
//靠右显示
margin-left: auto;
// margin-left: 10rpx;
// background-color: #67c23a;
}
.custom-input {
border: 1px solid #ccc;
border-radius: 4px;
padding: 5px;
height: 25px;
}
.order-detail-container {
padding: 16px;
background-color: #f5f5f5;
min-height: 100vh;
}
.flex-row {
display: flex;
align-items: center; /* 垂直居中对齐 */
gap: 10px; /* 标签和下拉框之间的间距 */
}
.page-title {
text-align: center;
margin-bottom: 24px;
color: #333;
font-size: 18px;
font-weight: 600;
padding: 12px 0;
background: #fff;
border-radius: 12px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
/* 基础信息网格布局 */
.info-section {
background: #fff;
border-radius: 12px;
padding: 16px;
margin-bottom: 20px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
.info-grid {
:deep(.uni-row) {
display: flex;
flex-wrap: wrap;
}
.info-value {
font-size: 15px;
color: #333;
font-weight: 500;
display: flex;
justify-content: flex-end;
}
margin-bottom: 20rpx;
margin-top: 20rpx;
}
.info-item {
margin-bottom: 12px;
}
.label {
font-size: 14px;
color: #666;
margin-bottom: 4px;
font-weight: 500;
}
.required::after {
content: '*';
color: #f56c6c;
margin-left: 2px;
}
.amount {
color: #f56c6c;
font-weight: 600;
}
.select-container {
width: 100%;
}
:deep(.uni-data-select__text) {
padding: 8px 12px;
border: 1px solid #ddd;
border-radius: 8px;
background-color: #fff;
}
:deep(.month-popup) {
min-width: 120px;
}
/* 商品信息区域 */
.goods-section {
background: #fff;
border-radius: 12px;
padding: 16px;
margin-bottom: 20px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
.section-title {
font-size: 16px;
color: #333;
margin: 0 0 16px 0;
padding-bottom: 8px;
border-bottom: 1px solid #eee;
font-weight: 600;
display: flex;
align-items: center;
}
.no-data {
text-align: center;
color: #999;
padding: 40px 0;
font-size: 14px;
}
/* 商品双栏布局 */
.goods-double-column {
display: flex;
flex-direction: column;
gap: 12px;
}
.goods-item {
border: 1px solid #eee;
border-radius: 12px;
overflow: hidden;
background: #fafafa;
}
.goods-header {
background: #409eff;
color: white;
padding: 10px 16px;
display: flex;
align-items: center;
gap: 12px;
}
.serial-number {
display: inline-flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
background: rgba(255, 255, 255, 0.2);
border-radius: 50%;
font-size: 12px;
font-weight: 600;
}
.goods-name {
font-size: 15px;
font-weight: 600;
flex: 1;
}
/* 商品内容区域 */
.goods-content {
padding: 12px 16px;
}
.info-row {
display: flex;
margin-bottom: 8px;
}
.info-pair {
flex: 1;
padding: 0 8px;
}
.info-pair .label {
font-size: 14px;
color: #666;
margin-bottom: 2px;
}
.info-pair .value {
font-size: 14px;
color: #333;
font-weight: 500;
text-align: right;
}
.quantity {
color: #409eff;
font-weight: 600;
}
.total {
color: #f56c6c;
font-weight: 600;
}
.empty {
visibility: hidden;
}
/* 操作按钮 */
.action-buttons {
display: flex;
justify-content: center;
gap: 12px;
padding: 16px 0;
background: #fff;
border-radius: 12px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
.btn {
padding: 12px 24px;
border: none;
border-radius: 8px;
font-size: 15px;
font-weight: 500;
cursor: pointer;
min-width: 80px;
text-align: center;
flex: 1;
}
.btn-primary {
background: #409eff;
color: white;
}
.btn-secondary {
background: #67c23a;
color: white;
}
.btn-outline {
background: #fff;
color: #333;
border: 1px solid #ddd;
}
/* 响应式设计 */
@media (max-width: 768px) {
.order-detail-container {
padding: 12px;
}
.info-item {
margin-bottom: 10px;
}
.info-pair {
padding: 0 4px;
}
.action-buttons {
flex-direction: column;
}
.btn {
width: 100%;
margin-bottom: 8px;
}
.btn:last-child {
margin-bottom: 0;
}
}
/* 添加多选框样式 */
.uni-checkbox {
display: inline-flex;
align-items: center;
margin-right: 8px;
}
</style>