whx 1 år sedan
förälder
incheckning
d4575d0481

+ 5 - 0
virgo.wzfrontend/console/package-lock.json

@@ -5767,6 +5767,11 @@
 				"assert-plus": "^1.0.0"
 			}
 		},
+		"dayjs": {
+			"version": "1.11.11",
+			"resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.11.tgz",
+			"integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg=="
+		},
 		"de-indent": {
 			"version": "1.0.2",
 			"resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz",

+ 1 - 0
virgo.wzfrontend/console/package.json

@@ -10,6 +10,7 @@
 	"dependencies": {
 		"@babel/polyfill": "^7.12.1",
 		"core-js": "^3.3.2",
+		"dayjs": "^1.11.11",
 		"element-ui": "^2.15.13",
 		"path-browserify": "^1.0.1",
 		"svg-sprite-loader": "^6.0.11",

+ 4 - 4
virgo.wzfrontend/console/src/components/common/projectItem.vue

@@ -1,13 +1,13 @@
 <template>
 	<el-form :model="formBox" ref="formBox" label-position="top">
-		<el-form-item label="单位工程" prop="projectItemId" :rules="[{required: true, message: '请选择单位工程'}]">
-			<el-select v-model="formBox.projectItemId" placeholder="请选择单位工程" @change="changeProjectItem">
+		<el-form-item label="楼宇" prop="projectItemId" :rules="[{required: true, message: '请选择楼宇'}]">
+			<el-select v-model="formBox.projectItemId" placeholder="请选择楼宇" @change="changeProjectItem">
 				<el-option v-for="item in projectItemList" :key="item.id" :label="item.name" :value="item.id">
 				</el-option>
 			</el-select>
 		</el-form-item>
-		<el-form-item label="具体位置" prop="projectItemTargetId" :rules="[{required: true, message: '请选择具体位置'}]">
-			<el-select v-model="formBox.projectItemTargetId" placeholder="请选择具体位置">
+		<el-form-item label="楼层" prop="projectItemTargetId" :rules="[{required: true, message: '请选择楼层'}]">
+			<el-select v-model="formBox.projectItemTargetId" placeholder="请选择楼层">
 				<el-option v-for="item in projectItemTargetList" :key="item.id" :label="item.name" :value="item.id">
 				</el-option>
 			</el-select>

+ 1 - 1
virgo.wzfrontend/console/src/components/common/selectHouse.vue

@@ -12,8 +12,8 @@
 		name: 'selectHouse',
 		data() {
 			return {
+				options: [],
 				props: {
-					options: [],
 					multiple: true
 				},
 			}

+ 19 - 3
virgo.wzfrontend/console/src/components/work/crm/customer/edit.vue

@@ -15,8 +15,8 @@
 				<el-form-item label="联系人" prop="person" :rules="[{required: true, message: '请输入联系人'}]">
 					<el-input type="text" v-model="customerForm.person" placeholder="请输入联系人"></el-input>
 				</el-form-item>
-				<el-form-item label="联系电话" prop="phone" :rules="[{required: true, message: '请输入客户名称'}]">
-					<el-input type="text" v-model="customerForm.phone" placeholder="请输入客户名称"></el-input>
+				<el-form-item label="联系电话" prop="phone" :rules="customerRulers.phone">
+					<el-input type="text" v-model="customerForm.phone" placeholder="请输入联系电话"></el-input>
 				</el-form-item>
 				<el-form-item label="微信号" prop="weChatAccount">
 					<el-input type="text" v-model="customerForm.weChatAccount" placeholder="请输入微信号"></el-input>
@@ -98,7 +98,23 @@
 					visitingChannels: '',
 					visitingTime: '',
 					remark: ''
-				}
+				},
+				customerRulers: {
+					phone: [{
+						required: true,
+						message: '请输入手机号',
+						trigger: 'blur'
+					}, {
+						validator: (rule, value, callback) => {
+							if (!/^1[123456789]\d{9}$/.test(value)) {
+								callback(new Error("请输入正确的手机号"));
+							} else {
+								callback()
+							}
+						},
+						trigger: 'blur'
+					}],
+				},
 			}
 		},
 		created() {

+ 12 - 0
virgo.wzfrontend/console/src/httpApi/crm.js

@@ -55,4 +55,16 @@ export function deleteCustomerById(id) {
 		url: `/manager/client/delete/${id}`,
 		method: 'delete'
 	})
+}
+/* 
+ * 绑定客户至组织项目
+ * 
+ * 
+ */
+export function bindProject(data) {
+	return request({
+		url: `/manager/bindProject`,
+		method: 'post',
+		data: data
+	})
 }

+ 5 - 0
virgo.wzfrontend/console/src/main.js

@@ -4,7 +4,9 @@ import router from './router'
 import store from './store'
 import ElementUI from 'element-ui';
 import 'element-ui/lib/theme-chalk/index.css';
+import dayjs from 'dayjs';
 
+Vue.prototype.$dayjs = dayjs;
 Vue.use(ElementUI);
 Vue.config.productionTip = false;
 
@@ -20,6 +22,9 @@ Vue.component('avatar', avatar)
 import field from './config/field.js'
 Vue.prototype.$field = field;
 
+import message from './uitls/message.js';
+Vue.prototype.$msg = message;
+
 Vue.prototype.$confirm = (title, callback) => {
 	return ElementUI.MessageBox.confirm(title, '有极提示', {
 		confirmButtonText: '确 定',

+ 48 - 0
virgo.wzfrontend/console/src/uitls/message.js

@@ -0,0 +1,48 @@
+import request from '@/axios';
+import store from '@/store';
+import dayjs from 'dayjs';
+
+const messageType = [{
+	id: 2,
+	name: '项目邀请'
+}];
+export default {
+	send(sendData = {}, params = {}) {
+		let date = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss');
+		let obj = {
+			projectId: store.getters.project.id,
+			organizationId: store.getters.organization.id,
+			date: date
+		}
+		params['time'] = date;
+		obj = Object.assign(obj, sendData);
+		let postData = {
+			sender: store.getters.user.userId,
+			messageType: params.messageType,
+			message: this.messageContent(params),
+			json: JSON.stringify(obj)
+		}
+		return request({
+			url: `/manager/message/${params.userIds}`,
+			method: 'post',
+			data: postData
+		})
+	},
+	viewed(messageId, callback) {
+		if (!messageId) return;
+		return request({
+			url: `/manager/message/${messageId}`,
+			method: 'put',
+		}).then(res => {
+			if (res.state && callback) callback()
+		})
+	},
+	messageContent(params) {
+		let message = '';
+		if (params.messageType === 2) {
+			message = `${store.getters.user.name}邀请你加入${store.getters.project.name}项目,请及时处理。`
+		}
+		return message;
+	},
+	messageType
+}

+ 28 - 2
virgo.wzfrontend/console/src/views/work/crm/customer.vue

@@ -16,9 +16,10 @@
 					</el-table-column>
 					<el-table-column label="客户名称" prop="name">
 					</el-table-column>
-					<el-table-column label="操作" width="150">
+					<el-table-column label="操作" width="200">
 						<template slot-scope="scope">
 							<div class="hui-table-operation">
+								<span class="table-operation" @click="inviteProject(scope.row)">邀请</span>
 								<span class="table-operation" @click="lookProject(scope.row)">详情</span>
 								<span class="table-operation" @click="updateProject(scope.row)">编辑</span>
 								<span class="table-operation" @click="deleteProject(scope.row)">删除</span>
@@ -48,8 +49,12 @@
 <script>
 	import {
 		getCustomerListByPage,
-		deleteCustomerById
+		deleteCustomerById,
+		bindProject
 	} from '@/httpApi/crm'
+	import {
+		testPhone
+	} from '@/httpApi/organization'
 	import edit from '@/components/work/crm/customer/edit'
 	import detail from '@/components/work/crm/customer/detail'
 	export default {
@@ -98,6 +103,27 @@
 				this.detailId = val.id;
 				this.drawer = true;
 			},
+			inviteProject(user) {
+				testPhone(user.phone).then(res => {
+					if (res.state) {
+						this.$confirm('是否邀请该用户至当前项目?', () => {
+							this.$msg.send({
+								dataId: user.id,
+								identityId: 1
+							}, {
+								messageType: 2,
+								userIds: res.data.id
+							}).then(node => {
+								if (node.state) {
+									this.$message.success('邀请成功');
+								}
+							})
+						});
+					} else {
+						this.$message.warning('用户不存在,无法绑定');
+					}
+				})
+			},
 			deleteCustomerById(val) {
 				this.$confirm('确定要删除该客户?', () => {
 					deleteProjectById(val.id).then(res => {

+ 1 - 4
virgo.wzfrontend/console/src/views/work/organization/user.vue

@@ -109,7 +109,6 @@
 	import role from '@/components/work/organization/user/role'
 	import detail from '@/components/work/organization/user/detail'
 	import edit from '@/components/work/organization/user/edit'
-	// import infoForm from '@/components/work/organization/user/infoForm'
 	export default {
 		data() {
 			return {
@@ -198,9 +197,7 @@
 			avatar,
 			edit,
 			role,
-			detail,
-			// userForm,
-			// infoForm
+			detail
 		}
 	}
 </script>