2 Commits f4b86609f3 ... 7f5b29bcbd

Autor SHA1 Mensagem Data
  文毅 7f5b29bcbd Merge branch 'main' of http://192.168.0.80:3000/aexiaoliou/project-manager 1 ano atrás
  文毅 0eff4c585a 增加接口 1 ano atrás

+ 16 - 7
h5/src/api/Urls.ts

@@ -27,17 +27,26 @@ const Urls = {
 		delete: 'admin/admin/delete', //删除/批量删除
 		resetPwd: 'admin/admin/resetPwd', //重置密码
 	},
-	//仓库模型
+	//项目汇总模型
 	repertory: {
 		list: '/admin/project/page',//分页
 		statuslist:'/admin/project/status/list',//获取状态字典
+		add: '/admin/project/create', //创建项目
+		edit: '/admin/project/update', //项目更新
+		delete: '/admin/project/delete', //项目删除
+		all:'/admin/admin/fullList',//参与人员列表
 
-		add: '/admin/repo/create', //创建仓库
-		edit: '/admin/repo/update', //仓库更新
-		delete: '/admin/repo/delete', //仓库删除
-		all: '/admin/repo/all', //所有仓库
-		IoDetail: '/admin/IoDetail/page', //首页详情
-		export: '/admin/io/export', //出入库导出
+		addschedules: '/admin/project/schedule/create', //创建进度
+		editschedules: '/admin/project/schedule/update', //进度更新
+		deleteschedules: '/admin/project/schedule/delete', //进度删除
+
+		listcontract: '/admin/project/contract/page', //合同分页
+		addcontract: '/admin/project/contract/create', //创建合同
+		editcontract: '/admin/project/contract/update', //合同更新
+		deletecontract: '/admin/project/contract/delete', //合同删除
+
+		addstatus: '/admin/project/status/create', //创建状态
+		editstatus: '/admin/project/status/update', //状态更新
 	},
 	//物品模型
 	good: {

+ 62 - 3
h5/src/api/model/Repertory.ts

@@ -1,6 +1,11 @@
 import Http from '/@/utils/net/Http';
 import Urls from '../Urls';
-import { data } from '/@/views/data/status';
+import status from '/@/views/data/status';
+
+interface statusData {
+	key: string;
+	value: string;
+}
 //gzs:仓库模型
 const Repertory = {
 	/**
@@ -22,7 +27,6 @@ const Repertory = {
 		let res = await Http.post(url, params);
 		return res;
 	},
-
 	async add(params: any) {
 		let url = Urls.repertory.add;
 		let res = await Http.post(url, params);
@@ -41,7 +45,62 @@ const Repertory = {
 	async statuslist(params: any) {
 		let url = Urls.repertory.statuslist;
 		let res = await Http.get(url, params);
-		data = res.data;
+		const data: statusData[] = res.data;
+		for (let keyValue of data) {
+			status.data.set(keyValue.key, keyValue.value);
+		}
+		return res;
+	},
+	async all(params: any) {
+		let url = Urls.repertory.all;
+		let res = await Http.get(url, params);
+		return res;
+	},
+	async addschedules(params: any) {
+		let url = Urls.repertory.addschedules;
+		let res = await Http.post(url, params);
+		return res;
+	},
+	async editschedules(params: any) {
+		let url = Urls.repertory.editschedules;
+		let res = await Http.post(url, params);
+		return res;
+	},
+	async deleteschedules(id: any) {
+		let url = Urls.repertory.deleteschedules;
+		let res = await Http.post(url, { id });
+		return res;
+	},
+
+	async listcontract(params: any) {
+		let url = Urls.repertory.listcontract;
+		let res = await Http.post(url, params);
+		return res;
+	},
+	async addcontract(params: any) {
+		let url = Urls.repertory.addcontract;
+		let res = await Http.post(url, params);
+		return res;
+	},
+	async editcontract(params: any) {
+		let url = Urls.repertory.editcontract;
+		let res = await Http.post(url, params);
+		return res;
+	},
+	async deletecontract(id: any) {
+		let url = Urls.repertory.deletecontract;
+		let res = await Http.post(url, { id });
+		return res;
+	},
+
+	async addstatus(params: any) {
+		let url = Urls.repertory.addstatus;
+		let res = await Http.post(url, params);
+		return res;
+	},
+	async editstatus(params: any) {
+		let url = Urls.repertory.editstatus;
+		let res = await Http.post(url, params);
 		return res;
 	},
 };

Diferenças do arquivo suprimidas por serem muito extensas
+ 660 - 107
h5/src/views/data/repertory.vue


+ 6 - 5
h5/src/views/data/status.ts

@@ -1,6 +1,7 @@
 import { reactive } from 'vue';
-interface statusData {
-	key?: string;
-	value?: string;
-}
-export const data = reactive<Array<statusData>>([]);
+
+
+const status = reactive<{ data: Map<string, string> }>({
+	data: new Map(),
+});
+export default status;

+ 10 - 56
h5/src/views/payrollModule/import.vue

@@ -2,13 +2,6 @@
 	<div class="system-edit-user-container">
 		<el-dialog :title="state.dialog.title" v-model="state.dialog.isShowDialog" width="800px" draggable
 			:close-on-click-modal="false">
-			<div>第一步:请点击下面的链接下载Excel模板,并按照模板填写信息。</div>
-			<a :href="state.download_file_url" target="target" download>
-				<el-button class="download-file" key="primary" type="default">
-					下载模板
-				</el-button>
-			</a>
-			<div class="two">第二步:导入Excel模板文件。</div>
 			<el-form :model="state.ruleForm" ref="refForm">
 				<el-form-item label="文件" prop="path" :rules="[{ required: true, message: '请上传文件' }]">
 					<el-upload ref="uploadEle" class="upload-demo" drag :action="state.uploadUrl" :limit="1"
@@ -24,7 +17,6 @@
 					</el-upload>
 				</el-form-item>
 			</el-form>
-
 			<template #footer>
 				<span class="dialog-footer">
 					<el-button @click="onCancel">取 消</el-button>
@@ -36,14 +28,12 @@
 </template>
 
 <script lang="ts" setup name="payrollModuleAttendanceImport">
-import { reactive, ref, nextTick } from 'vue';
-import { ElMessageBox, ElMessage, ElLoading, genFileId } from 'element-plus';
+import { reactive, ref, } from 'vue';
+import { ElMessage, genFileId } from 'element-plus';
 import type { ElForm, UploadInstance, UploadProps, UploadRawFile } from 'element-plus';
 import { UploadFilled } from '@element-plus/icons-vue';
 type FormInstance = InstanceType<typeof ElForm>;
-// import noPacking from '/@/api/noPacking/noPacking.ts';
-import Good from '/@/api/model/Good'; //gzs:引入模型
-import config from '/@/config.ts';
+import config from '/@/config';
 import { Session } from '/@/utils/storage';
 
 // 定义子组件向父组件传值/事件
@@ -66,7 +56,7 @@ const state = reactive<any>({
 	},
 	isTips: false,
 	fileUrl: '',
-	uploadUrl: config.host + '/admin/good/import',
+	uploadUrl: config.host + '/admin/upload/attachment',
 	download_file_url: config.file + '/public/static/execl/GOOD_TEMPLATE.xlsx',
 	getToken: Session.get('token')
 });
@@ -78,8 +68,8 @@ const openDialog = () => {
 	};
 	ClearFiles();
 	state.dialog.isShowDialog = true;
-	state.dialog.title = '导入物品记录表';
-	state.dialog.submitTxt = '导 入';
+	state.dialog.title = '上传附件';
+	state.dialog.submitTxt = '上传';
 };
 // 关闭弹窗
 const closeDialog = () => {
@@ -89,7 +79,6 @@ const closeDialog = () => {
 const onCancel = () => {
 	closeDialog();
 };
-
 // 清除文件缓存
 const ClearFiles = () => {
 	console.log('uploadEle.value=>', uploadEle.value);
@@ -103,6 +92,7 @@ const ClearFiles = () => {
 // 新增
 const onSubmit = () => {
 	uploadEle.value!.submit()
+	closeDialog();
 };
 //替换上一次文件
 const handleExceed: UploadProps['onExceed'] = (files) => {
@@ -111,44 +101,6 @@ const handleExceed: UploadProps['onExceed'] = (files) => {
 	file.uid = genFileId()
 	uploadEle.value!.handleStart(file)
 }
-// const onSubmit = (formEl: FormInstance | undefined) => {
-// 	console.log('state.ruleForm.path', state.ruleForm.path);
-// 	console.log('onSubmit formEl', formEl);
-// 	// if (!state.ruleForm.path) {
-// 	// 	ElMessage.error('请先上传');
-// 	// 	return;
-// 	// }
-// 	if (!formEl) return;
-// 	formEl.validate(async (valid) => {
-// 		console.log('valid', valid);
-// 		if (valid) {
-// 			const loadingInstance = ElLoading.service({ fullscreen: true,text: "正在导入中" })
-// 			let res: any = null;
-// 			res = await Good.import(state.ruleForm);
-// 			if (res.code != 0) {
-// 				nextTick(() => {
-// 					loadingInstance.close()
-// 				})
-// 				clearData();
-// 				closeDialog();
-// 				ElMessage.error(res.msg);
-// 				return;
-// 			}
-// 			clearData();
-// 			closeDialog();
-// 			ElMessage.success(res.msg);
-// 			console.log('submit succ!');
-// 			emit('refresh');
-// 			nextTick(() => {
-// 				loadingInstance.close()
-// 			})
-// 		} else {
-// 			ElMessage.error('导入失败,请检查表格是否正确');
-// 			console.log('error submit!');
-// 			return false;
-// 		}
-// 	});
-// };
 
 const clearData = () => {
 	state.isTips = false;
@@ -162,9 +114,11 @@ const handleAvatarSuccess = (res: any, file: any) => {
 		ElMessage.success('上传成功!');
 		console.log('res=>', res);
 		console.log('file=>', file);
-		state.ruleForm.path = res.data.file;
+		state.ruleForm.path = res.data.path;
 		state.fileUrl = res.data.url;
 		state.isTips = true;
+
+		emit('refresh', [state.ruleForm.path, file.name]);
 	}
 };