提交 664c9a46 authored 作者: 袁伟伟's avatar 袁伟伟

feat: 批量订单发货单

上级 f0aea502
...@@ -13,11 +13,11 @@ VITE_PUBLIC_PATH=/ ...@@ -13,11 +13,11 @@ VITE_PUBLIC_PATH=/
VITE_DROP_CONSOLE=false VITE_DROP_CONSOLE=false
# Basic interface address SPA # Basic interface address SPA
VITE_GLOB_API_URL=http://42.192.95.9:10083 VITE_GLOB_API_URL=http://192.168.101.69:8087
#VITE_GLOB_API_URL=http://192.168.101.69:8087 #VITE_GLOB_API_URL=http://42.192.95.9:10083
# File upload address, optional # File upload address, optional
VITE_GLOB_UPLOAD_URL=http://192.168.101.69:8087/v1/sys/upload VITE_GLOB_UPLOAD_URL=http://42.192.95.9:10083/v1/sys/upload
# Interface prefix # Interface prefix
VITE_GLOB_API_URL_PREFIX= VITE_GLOB_API_URL_PREFIX=
...@@ -162,9 +162,5 @@ ...@@ -162,9 +162,5 @@
</div> </div>
</div> </div>
<script type="module" src="/src/main.ts"></script> <script type="module" src="/src/main.ts"></script>
<script src="/src/assets/lib/easeljs.min.js"></script>
<script src="/src/assets/lib/eventemitter2.js"></script>
<script src="/src/assets/lib/roslib.min.js"></script>
<script src="/src/assets/lib/ros2d.js"></script>
</body> </body>
</html> </html>
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
*/ */
import { BasePageParams, PageResult, ApiResponse } from './baseModel'; import { BasePageParams, PageResult, ApiResponse } from './baseModel';
import { BatchOrderDetail } from './batchOrderDetail';
export interface BatchOrderParams extends BasePageParams { export interface BatchOrderParams extends BasePageParams {
/** /**
...@@ -130,6 +131,7 @@ export interface BatchOrderParams extends BasePageParams { ...@@ -130,6 +131,7 @@ export interface BatchOrderParams extends BasePageParams {
} }
export interface BatchOrder { export interface BatchOrder {
batchOrderId: number | undefined;
/** /**
* ID系统自动生成 * ID系统自动生成
*/ */
...@@ -138,6 +140,7 @@ export interface BatchOrder { ...@@ -138,6 +140,7 @@ export interface BatchOrder {
* ID系统自动生成 * ID系统自动生成
*/ */
batchOrderDetailList?: Array<BatchOrderDetail>; batchOrderDetailList?: Array<BatchOrderDetail>;
batchWorkOrderDetailList?: Array<BatchOrderDetail>;
/** /**
* 经销商id * 经销商id
*/ */
......
...@@ -83,6 +83,9 @@ export interface BatchOrderDetailParams extends BasePageParams { ...@@ -83,6 +83,9 @@ export interface BatchOrderDetailParams extends BasePageParams {
} }
export interface BatchOrderDetail { export interface BatchOrderDetail {
batchWorkOrderDetailProductDetailList: any;
uuid: string;
batchOrderDetailProductDetailList: any;
/** /**
* ID系统自动生成 * ID系统自动生成
*/ */
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
*/ */
import { BasePageParams, PageResult, ApiResponse } from './baseModel'; import { BasePageParams, PageResult, ApiResponse } from './baseModel';
import { BatchOrder } from './batchOrder';
import { OperationOrder } from './operationOrder'; import { OperationOrder } from './operationOrder';
export interface BatchWorkOrderParams extends BasePageParams { export interface BatchWorkOrderParams extends BasePageParams {
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
*/ */
import { BasePageParams, PageResult, ApiResponse } from './baseModel'; import { BasePageParams, PageResult, ApiResponse } from './baseModel';
import { BatchOrder } from './batchOrder';
import { BatchOrderDetail } from './batchOrderDetail';
import { Hospital } from './hospital'; import { Hospital } from './hospital';
export interface OperationOrderParams extends BasePageParams { export interface OperationOrderParams extends BasePageParams {
...@@ -275,6 +277,7 @@ export interface OperationOrder { ...@@ -275,6 +277,7 @@ export interface OperationOrder {
* update_time * update_time
*/ */
updateTime?: Date; updateTime?: Date;
batchOrderDetailList: BatchOrderDetail[];
} }
export type OperationOrderPageResult = PageResult<OperationOrder>; export type OperationOrderPageResult = PageResult<OperationOrder>;
......
...@@ -13,26 +13,24 @@ import { ...@@ -13,26 +13,24 @@ import {
BatchWorkOrderPageResponse, BatchWorkOrderPageResponse,
BatchWorkOrderResponse, BatchWorkOrderResponse,
} from '../model/batchWorkOrder'; } from '../model/batchWorkOrder';
import { BatchOrder } from '../model/batchOrder';
const baseApi = '/v1/order/batch-work-order'; const baseApi = '/v1/order/batch-work-order';
/** /**
* 新增 * 新增
*/ */
export const add = (entity: BatchWorkOrder) => export const add = (entity: BatchWorkOrder) => defHttp.post<BatchWorkOrder>({ url: `${baseApi}/`, data: entity });
defHttp.post<BatchWorkOrder>({ url: `${baseApi}/`, data: entity });
/** /**
* 更新 * 更新
*/ */
export const update = (entity: BatchWorkOrder) => export const update = (entity: BatchWorkOrder) => defHttp.put<BatchWorkOrder>({ url: `${baseApi}/`, data: entity });
defHttp.put<BatchWorkOrder>({ url: `${baseApi}/`, data: entity });
/** /**
* 删除 * 删除
*/ */
export const remove = (id: any) => export const remove = (id: any) => defHttp.delete<Number>({ url: `${baseApi}/${id}` });
defHttp.delete<Number>({ url: `${baseApi}/${id}` });
/** /**
* 分页查询 * 分页查询
...@@ -49,14 +47,12 @@ export const all = (params?: BatchWorkOrderParams) => ...@@ -49,14 +47,12 @@ export const all = (params?: BatchWorkOrderParams) =>
/** /**
* 通过主键查询 * 通过主键查询
*/ */
export const getById = (id: any) => export const getById = (id: any) => defHttp.get<BatchWorkOrder>({ url: `${baseApi}/${id}` });
defHttp.get<BatchWorkOrder>({ url: `${baseApi}/${id}` });
/** /**
* 单个查询 * 单个查询
*/ */
export const getOne = (params?: BatchWorkOrderParams) => export const getOne = (params?: BatchWorkOrderParams) => defHttp.get<BatchWorkOrder>({ url: `${baseApi}/one`, params });
defHttp.get<BatchWorkOrder>({ url: `${baseApi}/one`, params });
/** /**
* 批量删除 * 批量删除
...@@ -79,7 +75,9 @@ export const batchUpdate = (entityList: Array<BatchWorkOrder>) => ...@@ -79,7 +75,9 @@ export const batchUpdate = (entityList: Array<BatchWorkOrder>) =>
/** /**
* 查询数量 * 查询数量
*/ */
export const count = (params?: BatchWorkOrderParams) => export const count = (params?: BatchWorkOrderParams) => defHttp.get<Number>({ url: `${baseApi}/count`, params });
defHttp.get<Number>({ url: `${baseApi}/count`, params });
/**
* 新建发货单
*/
export const addInvoice = (data?: any) => defHttp.post({ url: `${baseApi}/create/send/order`, data });
...@@ -77,13 +77,15 @@ const getCartList = (productList) => { ...@@ -77,13 +77,15 @@ const getCartList = (productList) => {
item.cartProductDetailList.forEach((product) => { item.cartProductDetailList.forEach((product) => {
product.uuid = item.goodsId + '-' + product.id; product.uuid = item.goodsId + '-' + product.id;
product.type = item.goods.goodsType; product.goodsType = item.goods.goodsType;
if (item.goodsType === 'KIT') { if (item.goodsType === 'KIT') {
product.basicQuantity = product.quantity / item.quantity; product.basicQuantity = product.quantity / item.quantity;
} }
product.name = item.goods.name;
}); });
}); });
productList.value = res; productList.value = res;
console.log(res);
}); });
}; };
......
...@@ -23,6 +23,21 @@ ...@@ -23,6 +23,21 @@
rowKey="uuid" rowKey="uuid"
:scroll="{ y: 450 }" :scroll="{ y: 450 }"
> >
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'total'">
{{ record.goodsId ? '' : record.price * record.quantity }}
</template>
<template v-if="column.key === 'price'">
{{ record.goodsId ? '' : record.price }}
</template>
<template v-if="column.key === 'quantity'">
{{ record.goodsId ? '' : record.quantity }}
</template>
<template v-if="column.key === 'goodsType'">
<span v-if="record.goodsType === 'PRODUCT'">产品</span>
<span v-else-if="record.goodsType === 'KIT'">套件</span>
</template>
</template>
</a-table> </a-table>
<div class="btnWrap"> <div class="btnWrap">
<a-button <a-button
...@@ -90,8 +105,10 @@ ...@@ -90,8 +105,10 @@
return BatchOrderApi.getById(id.value).then((res: BatchOrder) => { return BatchOrderApi.getById(id.value).then((res: BatchOrder) => {
res.batchOrderDetailList?.forEach((item) => { res.batchOrderDetailList?.forEach((item) => {
item.uuid = item.goodsId + ''; item.uuid = item.goodsId + '';
item.batchOrderDetailProductDetailList.forEach((el) => { item.batchOrderDetailProductDetailList.forEach((el) => {
el.uuid = item.goodsId + '-' + el.id; el.uuid = item.goodsId + '-' + el.id;
el.goodsType = item.goodsType;
}); });
}); });
productList.value = res.batchOrderDetailList; productList.value = res.batchOrderDetailList;
......
...@@ -109,12 +109,12 @@ export const schema = { ...@@ -109,12 +109,12 @@ export const schema = {
}, },
{ {
field: 'distributorName', field: 'distributorName',
label: '供应商名称', label: '经销商',
defaultValue: undefined, defaultValue: undefined,
form: { form: {
componentProps: { componentProps: {
allowClear: true, allowClear: true,
placeholder: '供应商名称', placeholder: '经销商',
}, },
colProps, colProps,
component: 'Input', component: 'Input',
...@@ -418,7 +418,7 @@ const tableFields = [ ...@@ -418,7 +418,7 @@ const tableFields = [
'createTime', 'createTime',
]; ];
const descriptionFields = [ const descriptionFields = [
'id', // 'id',
'orderSn', 'orderSn',
'exWarehouse', 'exWarehouse',
'distributorName', 'distributorName',
...@@ -489,54 +489,54 @@ export const detailColumns = [ ...@@ -489,54 +489,54 @@ export const detailColumns = [
dataIndex: 'thirdProductId', dataIndex: 'thirdProductId',
key: 'thirdProductId', key: 'thirdProductId',
}, },
{ // {
title: '标识名称', // title: '标识名称',
dataIndex: 'thirdProductId10', // dataIndex: 'thirdProductId10',
key: 'thirdProductId10', // key: 'thirdProductId10',
}, // },
{ {
title: '产品名称', title: '产品名称',
dataIndex: 'name', dataIndex: 'name',
key: 'name', key: 'name',
}, },
{ // {
title: '规格型号', // title: '规格型号',
dataIndex: 'thirdProductId8', // dataIndex: 'thirdProductId8',
key: 'thirdProductId8', // key: 'thirdProductId8',
}, // },
{ // {
title: '单位', // title: '单位',
dataIndex: 'thirdProductId7', // dataIndex: 'thirdProductId7',
key: 'thirdProductId7', // key: 'thirdProductId7',
}, // },
{ {
title: '类型', title: '类型',
dataIndex: 'thirdProductId6', dataIndex: 'goodsType',
key: 'thirdProductId6', key: 'goodsType',
}, },
{ {
title: '订购数量', title: '订购数量',
dataIndex: 'quantity', dataIndex: 'quantity',
key: 'thirdProductId5', key: 'quantity',
},
{
title: '取消数量',
dataIndex: 'thirdProductId4',
key: 'thirdProductId4',
},
{
title: '发货数量',
dataIndex: 'thirdProductId3',
key: 'thirdProductId3',
}, },
// {
// title: '取消数量',
// dataIndex: 'thirdProductId4',
// key: 'thirdProductId4',
// },
// {
// title: '发货数量',
// dataIndex: 'thirdProductId3',
// key: 'thirdProductId3',
// },
{ {
title: '单价', title: '单价',
dataIndex: 'thirdProductId2', dataIndex: 'price',
key: 'thirdProductId2', key: 'price',
}, },
{ {
title: '行总价', title: '总价',
dataIndex: 'thirdProductId1', key: 'total',
key: 'thirdProductId1',
}, },
]; ];
<template> <template>
<Card :bordered="false"> <Card :bordered="false" :loading="isLoading">
<Descriptions bordered :column="3"> <Descriptions bordered :column="3">
<Descriptions.Item label="发货单号">
{{ id }}
</Descriptions.Item>
<Descriptions.Item <Descriptions.Item
v-for="p in displayProps" v-for="p in displayProps"
:key="p.title" :key="p.title"
...@@ -8,52 +11,126 @@ ...@@ -8,52 +11,126 @@
:span="['avatar'].includes(p.name) ? 3 : 1" :span="['avatar'].includes(p.name) ? 3 : 1"
> >
<span v-if="p.key === 'avatar'"> <span v-if="p.key === 'avatar'">
<img :src="p.value" style="width: 120px; height: 120px" /> <ImagePreview :imageList="[p.value]" style="width: 120px" />
</span> </span>
<template v-else> <template v-else>
{{ p.value }} {{ p.value }}
</template> </template>
</Descriptions.Item> </Descriptions.Item>
</Descriptions> </Descriptions>
<a-table
:dataSource="productList"
:columns="detailColumns"
:pagination="false"
childrenColumnName="batchWorkOrderDetailProductDetailList"
rowKey="uuid"
:scroll="{ y: 450 }"
>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'total'">
{{ record.goodsId ? '' : record.price * record.quantity }}
</template>
<template v-if="column.key === 'price'">
{{ record.goodsId ? '' : record.price }}
</template>
<template v-if="column.key === 'ordered'">
{{ record.goodsId ? '' : record.ordered }}
</template>
<template v-if="column.key === 'quantity'">
{{ record.goodsId ? '' : record.quantity }}
</template>
<template v-if="column.key === 'goodsType'">
<span v-if="record.goodsType === 'PRODUCT'">产品</span>
<span v-else-if="record.goodsType === 'KIT'">套件</span>
</template>
</template>
</a-table>
</Card> </Card>
</template> </template>
<script lang="ts" setup name="DeviceDetail"> <script lang="ts" setup>
import { onMounted, computed, ref, reactive } from 'vue'; import { onMounted, computed, ref } from 'vue';
import { useRoute } from 'vue-router'; import { Card, Descriptions } from 'ant-design-vue';
import { ComputedRef } from '@vue/reactivity'; import { ComputedRef } from '@vue/reactivity';
import { Descriptions, Card } from 'ant-design-vue'; import { useAsyncState } from '@vueuse/core';
import { descriptionColumns } from './schema';
import * as BatchWorkOrderApi from '/@/api/order/batchWorkOrderApi'; import * as BatchWorkOrderApi from '/@/api/order/batchWorkOrderApi';
import { Device } from '/@/api/model/device'; import { useRoute, useRouter } from 'vue-router';
import { descriptionColumns } from '/@/views/order/batch-order/schema';
import * as BatchOrderApi from '/@/api/order/batchOrderApi';
import { detailColumns } from '/@/views/order/batch-work-order/schema';
import { BatchOrderDetail } from '/@/api/model/batchOrderDetail';
import { BatchWorkOrder } from '/@/api/model/batchWorkOrder';
const route = useRoute(); const route = useRoute();
const id = ref(route.params?.id); const id = ref(route.params?.id);
let data = reactive({ const batchOrderId = ref(route.query?.order);
detail: {},
isOver: false,
});
const getDetail = () => {
BatchWorkOrderApi.getById(id.value).then((res: Device) => {
data.isOver = true;
data.detail = res;
});
};
onMounted(() => { const {
getDetail(); state: detail,
isReady: isDetailReady,
isLoading,
execute,
} = useAsyncState(
() => {
return BatchOrderApi.getById(batchOrderId.value).then((res: BatchOrder) => {
return res;
}); });
},
null,
{
immediate: false,
},
);
const displayProps: ComputedRef<Array<any>> = computed(() => { const displayProps: ComputedRef<Array<any>> = computed(() => {
if (!data.isOver) return {}; if (!isDetailReady.value) return {};
const display: any = descriptionColumns.map(({ title, dataIndex = '', customRender }) => ({ const display: any = descriptionColumns.map(({ title, dataIndex = '', customRender }) => ({
key: dataIndex, key: dataIndex,
title, title,
value: customRender value: customRender
? customRender({ text: data.detail[dataIndex], record: data.detail }) ? customRender({ text: detail.value[dataIndex], record: detail.value })
: data.detail[dataIndex], : detail.value[dataIndex],
})); }));
return display; return display;
}); });
const productList = ref<BatchOrderDetail[] | undefined>();
const getOrderWorkDetail = () => {
BatchWorkOrderApi.getById(id.value)
.then((res: BatchWorkOrder) => {
const thirdProductId = {};
res.batchOrder?.batchOrderDetailList.forEach((item) => {
item.batchOrderDetailProductDetailList.forEach((el) => {
thirdProductId[el.thirdProductId] = el.quantity;
});
});
res.batchWorkOrderDetailList?.forEach((item) => {
item.uuid = item.goodsId + '';
item.batchWorkOrderDetailProductDetailList.forEach((el) => {
el.uuid = item.goodsId + '-' + el.id;
el.ordered = thirdProductId[el.thirdProductId];
el.goodsType = item.goodsType;
});
});
productList.value = res.batchWorkOrderDetailList;
console.log(res);
})
.finally(() => {
// tableLoading.value = false
});
};
onMounted(() => {
execute();
getOrderWorkDetail();
});
</script> </script>
<style scoped></style> <style scoped>
.ant-table-wrapper {
margin-top: 20px;
}
</style>
<template>
<BasicDrawer v-bind="$attrs" @register="registerDrawer" showFooter :title="getTitle" width="600px" @ok="handleSubmit">
<BasicForm @register="registerForm" />
</BasicDrawer>
</template>
<script lang="ts" setup name="BatchWorkOrderDrawer">
import { defineEmits, ref, computed, unref } from 'vue';
import { BasicForm, useForm } from '/@/components/Form/index';
import { formSchema } from './schema';
import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
import * as BatchWorkOrderApi from '/@/api/order/batchWorkOrderApi';
const emit = defineEmits(['success', 'register']);
const isUpdate = ref(true);
const entityId = ref(0);
const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
labelWidth: 120,
schemas: formSchema,
showActionButtonGroup: false,
});
const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
await resetFields();
setDrawerProps({ confirmLoading: false });
isUpdate.value = !!data?.isUpdate;
entityId.value = data?.record?.id;
if (unref(isUpdate)) {
await setFieldsValue({
...data.record,
batchOrderId: { label: data.record.batch_orderName, value: data.record.batchOrderId },
});
}
});
const getTitle = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));
async function handleSubmit() {
try {
const values = await validate();
setDrawerProps({ confirmLoading: true });
const {
batchOrderId,
...rest
} = values;
const action = !unref(isUpdate) ? BatchWorkOrderApi.add : BatchWorkOrderApi.update;
const data = !unref(isUpdate)
? {
...rest,
batchOrderId: batchOrderId.value,
batch_orderName: batchOrderId.label,
}
: Object.assign({},
{
...rest,
id: unref(entityId),
batchOrderId: batchOrderId.value,
batch_orderName: batchOrderId.label,
},
);
await action(data);
closeDrawer();
emit('success');
} finally {
setDrawerProps({ confirmLoading: false });
}
}
</script>
<template> <template>
<div> <div class="containe">
<BasicTable @register="registerTable"> <div class="queryWrap">
<template #headerTop> <a-form
<a-alert type="info" show-icon> :model="formState"
<template #message> name="basic"
<template v-if="checkedKeys.length > 0"> ref="formRef"
<span>已选中{{ checkedKeys.length }}条记录</span> layout="inline"
<a-button type="link" @click="checkedKeys = []" size="small">清空</a-button> :label-col="{ span: 8 }"
<a-popconfirm :wrapper-col="{ span: 16 }"
class="ml-4" autocomplete="off"
title="确定要全部删除吗?" class="ant-row"
ok-text="是"
cancel-text="否"
@confirm="handleBatchDelete"
> >
<a href="#" class="text-red-500">删除</a> <a-form-item label="创建时间">
</a-popconfirm> <a-range-picker
</template> @change="onChangeTime"
<template v-else> :show-time="{ format: 'HH:mm:ss' }"
<span>未选中任何项目</span> valueFormat="YYYY-MM-DD HH:mm:ss"
</template> />
</template> </a-form-item>
</a-alert> <a-form-item :wrapper-col="{ offset: 8, span: 16 }">
</template> <a-button @click="handleReset">重置</a-button>
<template #toolbar> <a-button type="primary" @click="getData">查询</a-button>
<a-button v-auth="'AUTH_ORDER_BATCH_WORK_ORDER:ADD'" type="primary" @click="handleCreate"> 新增</a-button> </a-form-item>
</a-form>
</div>
<div class="tableWrap">
<div class="titleWrap">
<span class="title">发货单列表</span>
<a-button type="primary" @click="handleAdd">新增</a-button>
</div>
<a-table
:dataSource="dataSource"
:columns="columns"
:pagination="pagination"
:loading="tableLoading"
:row-class-name="(_record, index) => (index % 2 === 1 ? 'table-striped' : null)"
bordered
>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'status'">
{{ StatusEnum[record.status] }}
</template> </template>
<template #bodyCell="{ column, record, text }"> <template v-if="column.key === 'distributor'">
<template v-if="column.dataIndex === 'id'"> {{ record.batchOrder.distributorName }}
<a @click="handleView(record)"> {{ record.id }} </a>
</template> </template>
<template v-if="[].includes(column.dataIndex)"> <template v-if="column.key === 'saleUserName'">
<img :src="text" class="photo" alt="图片" v-if="!!text" /> {{ record.batchOrder.saleUserName }}
</template> </template>
<template v-if="column.dataIndex === 'action'"> <template v-if="column.key === 'action'">
<TableAction <a-button type="link" @click="handleView(record)">查看</a-button>
:actions="[ <!-- <a-button type="link" @click="handleEdit(record.id)">编辑</a-button>
{ <a-popconfirm
tooltip: '编辑', title="是否确认删除?"
icon: 'clarity:note-edit-line', ok-text="是"
onClick: handleEdit.bind(null, record), cancel-text="否"
ifShow: hasPermission('AUTH_ORDER_BATCH_WORK_ORDER:EDIT'), @confirm="handleDelete(record.id)"
}, v-if="hasPermission('AUTH_PRODUCT_GOODS_CATEGORY:DELETE')"
{ >
tooltip: '删除', <a-button type="link">删除</a-button>
icon: 'ant-design:delete-outlined', </a-popconfirm> -->
color: 'error',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
},
ifShow: hasPermission('AUTH_ORDER_BATCH_WORK_ORDER:DELETE'),
},
]"
/>
</template> </template>
</template> </template>
</BasicTable> </a-table>
<BatchWorkOrderDrawer @register="registerDrawer" @success="handleSuccess" /> </div>
<Modal ref="modalRef" v-model:editId="editId" @handleSuccess="getData"></Modal>
</div> </div>
</template> </template>
<script lang="ts" setup name="DeviceIndex">
import { ref } from 'vue'; <script lang="ts" setup>
import { useGo } from '/@/hooks/web/usePage'; import { reactive, ref, onMounted } from 'vue';
import { usePermission } from '/@/hooks/web/usePermission'; import { usePagination } from '/@/hooks/myhooks/index';
import { BasicTable, useTable, TableAction } from '/@/components/Table';
import { isObject } from '/@/utils/is';
import moment from 'moment';
import * as BatchWorkOrderApi from '/@/api/order/batchWorkOrderApi'; import * as BatchWorkOrderApi from '/@/api/order/batchWorkOrderApi';
import { useDrawer } from '/@/components/Drawer'; import { columns } from './schema';
import componentSetting from '/@/settings/componentSetting'; import Modal from './modal.vue';
import BatchWorkOrderDrawer from './drawer.vue'; import { message } from 'ant-design-vue';
import { columns, searchFormSchema } from './schema'; import { StatusEnum } from '/@/views/order/batch-order/schema';
const { hasPermission } = usePermission(); import { useGo } from '/@/hooks/web/usePage';
const go = useGo(); const go = useGo();
const { formConfig, showTableSetting, bordered, showIndexColumn } = componentSetting.table;
const checkedKeys = ref<Array<string | number>>([]);
const onSelectChange = (selectedRowKeys: (string | number)[]) => {
checkedKeys.value = selectedRowKeys;
};
const [registerDrawer, { openDrawer }] = useDrawer(); const formRef = ref();
const [registerTable, { reload }] = useTable({ const modalRef = ref();
title: '批量订单工单表', const tableLoading = ref(false);
api: (params) => BatchWorkOrderApi.search(handleParams(params)),
columns,
formConfig: {
labelWidth: formConfig.labelWidth,
schemas: searchFormSchema,
showAdvancedButton: false,
},
rowSelection: {
type: 'checkbox',
selectedRowKeys: checkedKeys,
onChange: onSelectChange,
},
useSearchForm: true,
showTableSetting,
bordered,
showIndexColumn,
canResize: false,
rowKey: (record: any) => record.id,
actionColumn: {
width: 80,
title: '操作',
dataIndex: 'action',
fixed: 'right', const formState = reactive({
}, createTimeFrom: undefined,
createTimeTo: undefined,
}); });
const handleParams = (params) => { const dataSource = ref();
const { pageNum, pageSize } = params; const editId = ref();
const handledParams: any = { pageNum, pageSize };
Object.keys(params).forEach((key) => {
const schema = searchFormSchema.find((item) => item.field === key);
const value = params[key];
if (schema && value !== undefined && value !== '') {
if (schema.component === 'Input') {
handledParams[key] = `%${value.trim()}%`;
} else if (['Select', 'ApiSelect'].includes(schema.component)) {
handledParams[key] = isObject(value) ? value.value : value;
} else if (schema.component === 'RangePicker') {
handledParams[`${key}From`] = moment(value[0]).startOf('d').format('YYYY-MM-DD HH:mm:ss');
handledParams[`${key}To`] = moment(value[1]).endOf('d').format('YYYY-MM-DD HH:mm:ss');
} else if (schema.component === 'DatePicker') {
handledParams[key] = moment(value).format((schema.componentProps as any).format || 'YYYY-MM-DD');
} else {
handledParams[key] = value;
}
}
});
return handledParams;
};
const handleCreate = () => { const getData = () => {
openDrawer(true, { tableLoading.value = true;
isUpdate: false, BatchWorkOrderApi.search(
Object.assign({ pageSize: pagination.pageSize, pageNum: pagination.current, orderMode: 'SEND_ORDER' }, formState),
)
.then((res) => {
pagination.total = res.total;
dataSource.value = res.records;
})
.finally(() => {
tableLoading.value = false;
}); });
}; };
const handleEdit = (record: Recordable) => { const pagination = usePagination(getData);
openDrawer(true, {
record,
isUpdate: true,
});
};
const handleDelete = (record: Recordable) => { const handleReset = () => {
BatchWorkOrderApi.remove(record.id).then((_) => { formRef.value.resetFields();
reload();
});
}; };
const handleBatchDelete = () => { const handleAdd = () => {
BatchWorkOrderApi.batchRemove(checkedKeys.value).then((_) => { modalRef.value.open();
reload();
});
}; };
const handleSuccess = () => { const handleView = (record) => {
reload(); go('/main/batch-work-order/detail/' + record.id + `?order=${record.batchOrderId}`);
}; };
const handleView = (record) => { const onChangeTime = (data) => {
go('/order/batch-work-order/' + record.id); formState.createTimeFrom = data && data[0];
formState.createTimeTo = data && data[1];
}; };
// const handleEdit = (id) => {
// editId.value = id;
// handleAdd();
// };
// const handleDelete = (id) => {
// GoodsPriceApi.remove(id).then((res) => {
// message.success('删除成功');
// getData();
// });
// };
onMounted(() => {
getData();
});
</script> </script>
<style lang="less" scoped>
@import url('/@/style/index.less');
.ant-table-striped :deep(.table-striped) td {
background-color: #fafafa;
}
</style>
<template>
<a-modal
v-model:visible="visible"
:title="props.editId ? '编辑' : '新增'"
@ok="handleOk"
@cancel="handleCancel"
class="myModal"
width="1200px"
:confirm-loading="okLoading"
>
<div class="wrap">
<a-form
:model="formData"
name="basic"
ref="formRef"
layout="inline"
:label-col="{ span: 8 }"
:wrapper-col="{ span: 16 }"
autocomplete="off"
class="ant-row"
>
<a-form-item label="经销商" name="changeDistributorId">
<a-select
ref="select"
v-model:value="formData.changeDistributorId"
style="width: 200px"
@change="handleChangeDistributor"
>
<a-select-option :value="item.id" v-for="item in distributorList">{{ item.name }}</a-select-option>
</a-select>
</a-form-item>
<a-form-item label="订单" name="changeOrderId">
<a-select
ref="select"
v-model:value="formData.changeOrderId"
style="width: 200px"
@change="handleChangeOrder"
>
<a-select-option :value="item.id" v-for="item in orderList">{{ item.orderSn }}</a-select-option>
</a-select>
</a-form-item>
</a-form>
</div>
<a-table
:dataSource="productList"
:columns="detailColumns"
:pagination="false"
childrenColumnName="batchOrderDetailProductDetailList"
rowKey="uuid"
:scroll="{ y: 450 }"
:loading="tableLoading"
>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'total'">
{{ record.goodsId ? '' : record.price * record.quantity }}
</template>
<template v-if="column.key === 'price'">
{{ record.goodsId ? '' : record.price }}
</template>
<template v-if="column.key === 'ordered'">
{{ record.goodsId ? '' : record.ordered }}
</template>
<template v-if="column.key === 'quantity'">
<a-input-number v-model:value="record.quantity" :min="0" v-if="!record.goodsId" />
<span v-else></span>
</template>
<template v-if="column.key === 'goodsType'">
<span v-if="record.goodsType === 'PRODUCT'">产品</span>
<span v-else-if="record.goodsType === 'KIT'">套件</span>
</template>
</template>
</a-table>
</a-modal>
</template>
<script lang="ts" setup>
import { defineExpose, ref, reactive, defineEmits, watch, defineProps, onMounted } from 'vue';
import { detailColumns } from '/@/views/order/batch-work-order/schema';
import * as BatchOrderApi from '/@/api/order/batchOrderApi';
import * as DistributorApi from '/@/api/system/distributorApi';
import * as BatchWorkOrderApi from '/@/api/order/batchWorkOrderApi';
import lodash from 'lodash';
import { message } from 'ant-design-vue';
import { BatchOrder } from '/@/api/model/batchOrder';
import { Distributor } from '/@/api/model/distributor';
import { BatchOrderDetail } from '/@/api/model/batchOrderDetail';
const props = defineProps(['editId']);
const emits = defineEmits(['handleSuccess', 'update:editId']);
const visible = ref<boolean>(false);
const okLoading = ref(false);
const tableLoading = ref(false);
const handleOk = () => {
const orderClone = lodash.cloneDeep(order.value);
if (orderClone) {
orderClone.batchWorkOrderDetailList = orderClone.batchOrderDetailList;
orderClone.batchOrderId = orderClone.id;
orderClone.status = 'DELIVERED';
delete orderClone.batchOrderDetailList;
delete orderClone.id;
orderClone.batchWorkOrderDetailList?.forEach((item) => {
item.batchWorkOrderDetailProductDetailList = item.batchOrderDetailProductDetailList;
delete item.batchOrderDetailProductDetailList;
item.batchWorkOrderDetailProductDetailList.forEach((el) => {
el.batchWorkOrderDetailId = el.batchOrderDetailId;
delete el.batchOrderDetailId;
});
});
okLoading.value = true;
BatchWorkOrderApi.addInvoice(orderClone)
.then(() => {
message.success('新建成功');
handleCancel();
})
.finally(() => {
okLoading.value = false;
});
} else {
message.warning('请选择订单');
}
};
const handleCancel = () => {
distributorList.value = [];
orderList.value = [];
productList.value = [];
formData.changeDistributorId = formData.changeOrderId = '';
visible.value = false;
};
const open = () => {
visible.value = true;
getDistributorList();
};
const distributorList = ref<Distributor[] | []>([]);
const orderList = ref<BatchOrder[] | []>([]);
const productList = ref<BatchOrderDetail[] | undefined>();
const order = ref<BatchOrder>();
const formData = reactive({
changeDistributorId: '',
changeOrderId: '',
});
const getDistributorList = () => {
DistributorApi.all().then((res) => {
distributorList.value = res;
});
};
const handleChangeDistributor = (id: number) => {
BatchOrderApi.search({ pageNum: 1, pageSize: 99, distributorId: id, status: 'PASSED' }).then((res) => {
orderList.value = res.records;
});
};
const handleChangeOrder = (id: number) => {
tableLoading.value = true;
BatchOrderApi.getById(id)
.then((res: BatchOrder) => {
res.batchOrderDetailList?.forEach((item) => {
item.uuid = item.goodsId + '';
item.batchOrderDetailProductDetailList.forEach((el) => {
el.uuid = item.goodsId + '-' + el.id;
el.ordered = el.quantity;
el.goodsType = item.goodsType;
});
});
order.value = res;
productList.value = res.batchOrderDetailList;
})
.finally(() => {
tableLoading.value = false;
});
};
defineExpose({ open });
</script>
<style lang="less" scoped>
.wrap {
margin-bottom: 10px;
}
</style>
<template> <template>
<div class="nav"> <div class="nav">
<ul> <ul>
<li>产品线</li> <!-- <li>产品线</li> -->
<template v-for="(item, index) in navList"> <template v-for="(item, index) in navList">
<li v-if="index !== 4">|</li>
<li <li
class="title" class="title"
:class="{ active: navActiveKey === item.id || navId === item.id }" :class="{ active: navActiveKey === item.id || navId === item.id }"
@click="handleChangeNav(item.id)" @click="handleChangeNav(item.id)"
>{{ item.name }}</li >{{ item.name }}</li
> >
<li v-if="index !== navList.length - 1">|</li>
</template> </template>
</ul> </ul>
</div> </div>
...@@ -56,16 +56,25 @@ ...@@ -56,16 +56,25 @@
background: #f7f9fa; background: #f7f9fa;
text-align: center; text-align: center;
border-radius: 10px; border-radius: 10px;
height: 50px;
overflow-x: auto;
overflow-y: hidden;
margin-bottom: 15px;
ul { ul {
height: 50px; height: 50px;
padding: 5px; padding: 5px 15px;
// width: 1200px;
display: flex;
justify-content: space-between;
li { li {
font-size: 20px; font-size: 20px;
height: 40px; height: 40px;
line-height: 40px; line-height: 40px;
display: inline-block; // display: inline-block;
margin: 0 15px; margin: 0 15px;
flex-shrink: 0;
} }
.active { .active {
......
...@@ -7,17 +7,20 @@ ...@@ -7,17 +7,20 @@
size="large" size="large"
@search="onSearch" @search="onSearch"
/> />
<div class="shoppingCart" @click="handleGoShoppingCart"> <div class="shoppingCart" @click="handleGoShoppingCart" title="购物车">
<a-badge :count="shoppingCartNum"> <a-badge :count="shoppingCartNum">
<ShoppingCartOutlined /> <ShoppingCartOutlined />
</a-badge> </a-badge>
</div> </div>
<div class="close" title="关闭商城" @click="handleClose">
<CloseCircleOutlined />
</div>
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, defineProps, onMounted, watch } from 'vue'; import { ref, defineProps, onMounted, watch } from 'vue';
import { ShoppingCartOutlined } from '@ant-design/icons-vue'; import { ShoppingCartOutlined, CloseCircleOutlined } from '@ant-design/icons-vue';
import { useGo } from '/@/hooks/web/usePage'; import { useGo } from '/@/hooks/web/usePage';
import * as CartApi from '/@/api/order/cartApi'; import * as CartApi from '/@/api/order/cartApi';
import { useShoppingStoreWithOut } from '/@/store/modules/store'; import { useShoppingStoreWithOut } from '/@/store/modules/store';
...@@ -37,6 +40,10 @@ ...@@ -37,6 +40,10 @@
}); });
}; };
const handleClose = () => {
go('/main/dashboard', true);
};
watch( watch(
() => shoppingStore.shoppingCartRefresh, () => shoppingStore.shoppingCartRefresh,
() => { () => {
...@@ -67,7 +74,7 @@ ...@@ -67,7 +74,7 @@
height: 40px; height: 40px;
text-align: center; text-align: center;
position: absolute; position: absolute;
right: 20px; right: 80px;
top: 0; top: 0;
line-height: 40px; line-height: 40px;
font-size: 30px; font-size: 30px;
...@@ -84,5 +91,22 @@ ...@@ -84,5 +91,22 @@
font-size: 30px; font-size: 30px;
} }
} }
.close {
width: 40px;
height: 40px;
text-align: center;
position: absolute;
right: 20px;
top: 0;
line-height: 40px;
font-size: 25px;
cursor: pointer;
&:hover {
background: #eee;
border-radius: 50%;
}
}
} }
</style> </style>
...@@ -32,6 +32,9 @@ ...@@ -32,6 +32,9 @@
<p class="title">产品明细列表</p> <p class="title">产品明细列表</p>
<a-table :dataSource="productList" :columns="columns" :pagination="false"> <a-table :dataSource="productList" :columns="columns" :pagination="false">
<template #bodyCell="{ column, record }"> <template #bodyCell="{ column, record }">
<!-- <template v-if="column.key === 'name'">
{{ goodsInfo?.name }}
</template> -->
<template v-if="column.key === 'quantity'"> <template v-if="column.key === 'quantity'">
<a-input-number v-model:value="record.quantity" :min="0" :disabled="isKIT" /> <a-input-number v-model:value="record.quantity" :min="0" :disabled="isKIT" />
</template> </template>
...@@ -101,11 +104,13 @@ ...@@ -101,11 +104,13 @@
if (isPRODUCT.value) { if (isPRODUCT.value) {
res.productList.forEach((item) => { res.productList.forEach((item) => {
item.quantity = 0; item.quantity = 0;
item.type = '产品';
}); });
} else if (isKIT.value) { } else if (isKIT.value) {
res.productList.forEach((item) => { res.productList.forEach((item) => {
item.basicQuantity = item.quantity; item.basicQuantity = item.quantity;
item.quantity = 0; item.quantity = 0;
item.type = '套件';
}); });
} }
......
...@@ -4,30 +4,30 @@ export const columns = [ ...@@ -4,30 +4,30 @@ export const columns = [
dataIndex: 'thirdProductId', dataIndex: 'thirdProductId',
key: 'thirdProductId', key: 'thirdProductId',
}, },
{ // {
title: '名称', // title: '名称',
dataIndex: 'age', // dataIndex: 'name',
key: 'age', // key: 'name',
}, // },
{ // {
title: '描述信息', // title: '描述信息',
dataIndex: 'address', // dataIndex: 'address',
key: 'address', // key: 'address',
}, // },
{ // {
title: '型号', // title: '型号',
dataIndex: 'address1', // dataIndex: 'address1',
key: 'address1', // key: 'address1',
}, // },
{ // {
title: '包装', // title: '包装',
dataIndex: 'address2', // dataIndex: 'address2',
key: 'address2', // key: 'address2',
}, // },
{ {
title: '类型', title: '类型',
dataIndex: 'address2', dataIndex: 'type',
key: 'address2', key: 'type',
}, },
{ {
title: '数量', title: '数量',
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
</a-tab-pane> </a-tab-pane>
</a-tabs> </a-tabs>
</div> </div>
<dir class="wrap"> <div class="wrap">
<Nav v-model:navList="navList" v-model:navActiveKey="navActiveKey" /> <Nav v-model:navList="navList" v-model:navActiveKey="navActiveKey" />
<div class="bannerWrap"> <div class="bannerWrap">
<div class="banner"> <div class="banner">
...@@ -67,7 +67,7 @@ ...@@ -67,7 +67,7 @@
</div> </div>
</div> </div>
</div> </div>
</dir> </div>
</div> </div>
<div class="lineList"> <div class="lineList">
<div class="line" v-for="item in 3" :key="item"> <div class="line" v-for="item in 3" :key="item">
...@@ -132,17 +132,22 @@ ...@@ -132,17 +132,22 @@
const init = (changeId?: number) => { const init = (changeId?: number) => {
let idx = 0; let idx = 0;
let findId = changeId ? changeId : id; let findId = changeId ? changeId : id;
if (id || changeId) { if (!findId) {
findId = localStorage.getItem('navActiveKey');
}
if (findId) {
idx = navList.value.findIndex((item) => { idx = navList.value.findIndex((item) => {
return item.id === toNumber(findId); return item.id === toNumber(findId);
}); });
if (idx === -1) idx = 0; if (idx === -1) idx = 0;
} else {
} }
if (navList.value.length > 0) { if (navList.value.length > 0) {
tabList.value = navList.value[idx]?.children;
navActiveKey.value = navList.value[idx]?.id; navActiveKey.value = navList.value[idx]?.id;
activeTabKey.value = navList.value[idx]?.children[0]?.id; tabList.value = navList.value[idx]?.children || [];
activeTabKey.value = tabList.value[0]?.id || undefined;
localStorage.setItem('navActiveKey', navActiveKey.value);
} }
}; };
......
...@@ -28,6 +28,9 @@ ...@@ -28,6 +28,9 @@
<span v-if="record.goodsType === 'PRODUCT'">产品</span> <span v-if="record.goodsType === 'PRODUCT'">产品</span>
<span v-else-if="record.goodsType === 'KIT'">套件</span> <span v-else-if="record.goodsType === 'KIT'">套件</span>
</template> </template>
<template v-if="column.key === 'name'">
<span v-if="!record.name"> {{ record.goods.name }}</span>
</template>
<template v-if="column.key === 'quantity'"> <template v-if="column.key === 'quantity'">
<a-input-number <a-input-number
v-model:value="record.quantity" v-model:value="record.quantity"
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论