Commit af29fa40 authored by huangjie's avatar huangjie

Merge branch 'V20231129-中建一局二公司' of http://192.168.60.201/root/dsk-operate-sys...

Merge branch 'V20231129-中建一局二公司' of http://192.168.60.201/root/dsk-operate-sys into V20231129-中建一局二公司
parents ad6eb5c3 44e9eac6
......@@ -9,7 +9,6 @@ import com.dsk.cscec.domain.AdvisoryBodyCustomForm;
import com.dsk.cscec.domain.bo.*;
import com.dsk.cscec.domain.vo.*;
import com.dsk.cscec.service.AdvisoryBodyCustomFormService;
import com.dsk.cscec.service.AdvisoryBodyProjectService;
import com.dsk.cscec.service.AdvisoryBodyService;
import com.dsk.cscec.service.IDProjectService;
import org.springframework.transaction.annotation.Transactional;
......@@ -34,12 +33,10 @@ public class AdvisoryBodyManageController extends BaseController {
@Resource
private AdvisoryBodyService advisoryBodyService;
@Resource
private AdvisoryBodyProjectService advisoryBodyProjectService;
@Resource
private AdvisoryBodyCustomFormService advisoryBodyCustomFormService;
/**
* 获取所有项目列表数据
* 获取项目列表
*/
@GetMapping("/getProjectList")
public TableDataInfo<ProjectSearchVo> getProjectList(ProjectSearchBo projectSearchBo, PageQuery pageQuery) {
......@@ -93,7 +90,7 @@ public class AdvisoryBodyManageController extends BaseController {
* 新增/更新咨询机构与项目关联信息(advisory_body_project表)
*/
@PostMapping("/editAdvisoryBody")
public R<Void> editAdvisoryBody(@Validated EditAdvisoryBodyInfoBo editInfoBo) {
public R<Void> editAdvisoryBody(@Validated @RequestBody EditAdvisoryBodyInfoBo editInfoBo) {
return toAjax(advisoryBodyService.editAdvisoryBody(editInfoBo));
}
......@@ -110,7 +107,7 @@ public class AdvisoryBodyManageController extends BaseController {
*/
@PostMapping("/addAdvisoryBodyCustomForm")
@Transactional(rollbackFor = Exception.class)
public R<Void> addAdvisoryBodyCustomForm(@Validated AdvisoryBodyCustomForm advisoryBodyCustomForm) {
public R<Void> addAdvisoryBodyCustomForm(@Validated @RequestBody AdvisoryBodyCustomForm advisoryBodyCustomForm) {
return toAjax(advisoryBodyCustomFormService.save(advisoryBodyCustomForm));
}
......@@ -119,7 +116,7 @@ public class AdvisoryBodyManageController extends BaseController {
*/
@PutMapping("/updateAdvisoryBodyCustomForm")
@Transactional(rollbackFor = Exception.class)
public R<Void> updateAdvisoryBodyCustomForm(@Validated EditAdvisoryBodyCustomFormBo editBo) {
public R<Void> updateAdvisoryBodyCustomForm(@Validated @RequestBody EditAdvisoryBodyCustomFormBo editBo) {
return toAjax(advisoryBodyCustomFormService.updateById(editBo));
}
}
\ No newline at end of file
package com.dsk.jsk.service;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.dsk.acc.openapi.client.util.CommonUtils;
import com.dsk.common.core.domain.R;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.jsk.domain.*;
import com.dsk.system.utils.DskOpenApiUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @ClassName CompanyRelationTableV1Controller
......@@ -41,8 +47,49 @@ public class CompanyRelationTableV1Service {
} else {
map = dskOpenApiUtil.requestBody("/operate/consultancy/detailPage", BeanUtil.beanToMap(dto, false, false));
}
Map data = MapUtils.getMap(map, "data", null);
List<Object> list = CommonUtils.assertAsArray(MapUtils.getObject(data, "list", ""));
if (CollectionUtils.isEmpty(list)) {
return new TableDataInfo(list, 0);
}
for (Object dataMap : list) {
Map<String, Object> companyMap = CommonUtils.assertAsMap(dataMap);
String agencyBusinessType = MapUtils.getString(companyMap, "agencyBusinessType", "");
companyMap.put("agencyBusinessType", agencyBusinessType(agencyBusinessType, dto.getBusinessTypes()));
}
return dskOpenApiUtil.responsePage(map);
}
/***
*@Description: 取其一
*@Param:
*@return: java.lang.String
*@Author: Dgm
*@date: 2024/1/10 15:48
*/
private String agencyBusinessType (String name, List<String> businessTypes) {
List<String> businessType = new ArrayList<>();
if (ObjectUtil.isNotEmpty(name)) {
name = name.replaceAll("\\['","");
name = name.replaceAll("']", "");
name = name.replaceAll("'", "");
name = name.replaceAll(" ", "");
if (name.contains(",")) {
String[] split = name.split(",");
for (String s : split) {
businessType.add(s);
}
} else {
businessType.add(name);
}
}
String bTypes = null;
if (ObjectUtil.isNotEmpty(businessType)) {
bTypes = businessType.get(0);
}
return ObjectUtil.isNotEmpty(businessTypes) ?businessTypes.get(0): bTypes;
}
/***
*@Description: -分页列表-下拉
......
......@@ -80,7 +80,6 @@ public class ExportService {
//回调函数
composeQueryDto.setExportBackUrl(EXPORT_BACK_URL);
composeQueryDto.setExportExeclName(fileName);
log.info(JSONObject.toJSONString(composeQueryDto));
dskOpenApiUtil.requestBody("/operate/export/zjyj/aptitude", BeanUtil.beanToMap(composeQueryDto,false,false));
return AjaxResult.success();
}
......
......@@ -47,10 +47,12 @@
"js-md5": "^0.7.3",
"jsencrypt": "3.0.0-rc.1",
"json-editor-vue": "^0.11.1",
"lodash-es": "^4.17.21",
"mitt": "^3.0.1",
"nprogress": "0.2.0",
"quill": "1.3.7",
"screenfull": "5.0.2",
"serialize-javascript": "^6.0.2",
"sortablejs": "^1.15.0",
"uuid": "^9.0.1",
"vue": "2.6.12",
......
......@@ -66,4 +66,36 @@ export const updateConsultingDetailApi = (data) => request({
url: "/advisory/body/editAdvisoryBody",
method: "post",
data
});
\ No newline at end of file
});
/**
* 获取自定义表单
* @returns
*/
export const getCustomFormDetailApi = () => request({
url: "/advisory/body/getAdvisoryBodyCustomForm",
method: "get",
params: {}
});
/**
* 新增自定义表单
* @param {*} data
* @returns
*/
export const addCustomFormDataApi = (data) => request({
url: "/advisory/body/addAdvisoryBodyCustomForm",
method: "post",
data
});
/**
* 更新自定义表单
* @param {*} data
* @returns
*/
export const updateCustomFormDataApi = (data) => request({
url: "/advisory/body/updateAdvisoryBodyCustomForm",
method: "post",
data
});
// 默认自定义表单组件
import { validEmail } from "@/utils/validate";
/**
* 模块模板
......@@ -9,8 +10,7 @@ export const subfieldModuleTemplate = {
subfieldModuleNameRules: {
trigger: ["blur", "change"],
validator: (rule, value, callback) => {
alert(1);
if (!value) {
if (!value && !value?.toString()?.trim()) {
return callback(new Error("请输入分栏名称"));
}
callback();
......@@ -22,11 +22,12 @@ export const subfieldModuleTemplate = {
};
export const defaultComOptions = [
// 单行文本
{
// 组件类型
comType: "el-input",
comType: "text",
// 组件展示图标
comShowIcon: require("@/assets/images/consultingAgencyManagement/customForm/icon_single_line_text@2x.png"),
comShowIcon: "icon_single_line_text@2x.png",
// 验证通过
checkedAllow: false,
// 表单属性
......@@ -49,5 +50,174 @@ export const defaultComOptions = [
// 输入值为空提示
placeholder: "请输入"
}
}
},
// 多行文本
{
// 组件类型
comType: "textarea",
// 组件展示图标
comShowIcon: "icon_multiline_text@2x.png",
// 验证通过
checkedAllow: false,
// 表单属性
formAttribute: {
// 验证规则
rules: {},
// 是否必填
required: false,
// 字段名称
fieldName: "",
// 展示label
label: "多行文本",
// 组件宽度
width: 100
},
// 组件属性
componentAttribute: {
// 绑定的值
value: "",
// 输入值为空提示
placeholder: "请输入"
}
},
// 下拉选项
{
// 组件类型
comType: "select",
// 组件展示图标
comShowIcon: "icon_drop_down@2x.png",
// 验证通过
checkedAllow: false,
// 表单属性
formAttribute: {
// 验证规则
rules: {
required: true,
message: "请输入选项值",
trigger: ["change", "blur"]
},
// 是否必填
required: false,
// 字段名称
fieldName: "",
// 展示label
label: "下拉选项",
// 组件宽度
width: 100,
selectOptions: [],
// 是否多选
isMultiple: false
},
// 组件属性
componentAttribute: {
// 绑定的值
value: "",
// 输入值为空提示
placeholder: "请选择"
}
},
// 日期时间
{
// 组件类型
comType: "date",
// 组件展示图标
comShowIcon: "icon_data_time@2x.png",
// 验证通过
checkedAllow: false,
// 表单属性
formAttribute: {
// 验证规则
rules: {},
// 是否必填
required: false,
// 字段名称
fieldName: "",
// 展示label
label: "日期/时间",
// 组件宽度
width: 100
},
// 组件属性
componentAttribute: {
// 绑定的值
value: "",
// 输入值为空提示
placeholder: "请选择"
}
},
// 电话
{
// 组件类型
comType: "phone",
// 组件展示图标
comShowIcon: "icon_phone@2x.png",
// 验证通过
checkedAllow: false,
// 表单属性
formAttribute: {
// 验证规则
rules: {
trigger: ["blur", "change"],
validator: (rule, value, callback) => {
const phoneReg = /^1[3-9]\d{9}$/;
if (value && !phoneReg.test(value)) {
return callback(new Error(`请输入正确的联系电话`));
}
return callback();
}
},
// 是否必填
required: false,
// 字段名称
fieldName: "",
// 展示label
label: "电话",
// 组件宽度
width: 100
},
// 组件属性
componentAttribute: {
// 绑定的值
value: "",
// 输入值为空提示
placeholder: "请输入"
}
},
// 电子邮箱
{
// 组件类型
comType: "email",
// 组件展示图标
comShowIcon: "icon_email@2x.png",
// 验证通过
checkedAllow: false,
// 表单属性
formAttribute: {
// 验证规则
rules: {
trigger: ["blur", "change"],
validator: (rule, value, callback) => {
if (value && !validEmail(value)) {
return callback(new Error(`请输入正确的电子邮箱`));
}
return callback();
}
},
// 是否必填
required: false,
// 字段名称
fieldName: "",
// 展示label
label: "电子邮箱",
// 组件宽度
width: 100
},
// 组件属性
componentAttribute: {
// 绑定的值
value: "",
// 输入值为空提示
placeholder: "请输入"
}
},
];
\ No newline at end of file
......@@ -930,5 +930,27 @@ export const detailSideBar = new Map([
export const tableContainerFixed = (scrollBarContainer = "",) => {
}
};
/**
* 序列化 function
* @param {Function} fn
* @returns
*/
export const serializationFn = (fn) => {
const type = Object.prototype.toString.call(fn);
if (type != "[object AsyncFunction]" && type != "[object Function]") return;
return fn.toString();
};
/**
* 反序列化 function
* @param {string} fnStr
*/
export const deserializeFn = (fnStr) => {
try {
return new Function('return ' + fnStr)();
} catch (error) {
return null;
}
};
......@@ -11,7 +11,7 @@
<transition-group name="fade" tag="div" class="draggable-fields-list">
<div class="draggable-fields-item" :class="{'has-no-subfield-module' : !subfieldModuleForm.subfieldModuleList.length}"
v-for="(item,index) of defaultComOptions" :key="index" @click="fieldsItemClick">
<img :src="item.comShowIcon" alt="">
<img :src="require(`@/assets/images/consultingAgencyManagement/customForm/${item.comShowIcon}`)" alt="">
<span>{{item.formAttribute.label}}</span>
</div>
</transition-group>
......@@ -51,7 +51,8 @@
<div class="design-header field-options-header">字段设置</div>
<div class="design-main field-options-main">
<set-field-option v-if="showSetOption" :activeFieldData="activeItemData" :activeUid="activeUid" :parentUid="activeModuleId"
ref="setFieldOptionRef" @cancelSetOptions="cancelSetOptions" @setOptionsFinish="setOptionsFinish"></set-field-option>
ref="setFieldOptionRef" @cancelSetOptions="cancelSetOptions" @setOptionsFinish="setOptionsFinish"
@backfileData="backfileData"></set-field-option>
</div>
</div>
</div>
......@@ -84,6 +85,9 @@ import SetFieldOption from "@/views/consultingOrgManagement/components/CustomFor
import { elementMessageSingleton } from "@/utils";
import vuedraggable from "vuedraggable";
import { v4 } from 'uuid';
import { getCustomFormDetailApi, addCustomFormDataApi } from "@/api/consultingOrgManagement";
import { cloneDeep } from "lodash-es";
import serialize from "serialize-javascript";
export default {
name: "customFormDesign",
components: {
......@@ -147,17 +151,37 @@ export default {
const randomIndex = Math.floor(Math.random() * alphabet.length);
return alphabet[randomIndex];
},
initModule() {
// 模块初始化
this.addSubfieldModule();
const component = JSON.parse(JSON.stringify(defaultComOptions[0]));
component.uid = v4();
component.formAttribute.fieldName = this.generateRandomLowerCaseLetter() + component.uid.split("-").join("");
this.activeItemData = component;
this.activeItemDataOrigin = JSON.parse(JSON.stringify(this.activeItemData));
this.activeModuleId = this.subfieldModuleForm.subfieldModuleList[0].uid;
this.activeUid = component.uid;
this.subfieldModuleForm.subfieldModuleList[0].children.push(component);
async getCustomFormDetail() {
try {
const result = await getCustomFormDetailApi();
if (result.code == 200 && result.data?.length) {
return result.data;
}
return [];
} catch (error) {
}
},
async initModule() {
try {
const result = await this.getCustomFormDetail();
if (result.length) {
// 有模板数据 进行回显
return;
}
// 模块初始化
this.addSubfieldModule();
const component = cloneDeep(defaultComOptions[0]);
component.uid = v4();
component.formAttribute.fieldName = this.generateRandomLowerCaseLetter() + component.uid.split("-").join("");
this.activeItemData = component;
this.activeItemDataOrigin = cloneDeep(this.activeItemData);
this.activeModuleId = this.subfieldModuleForm.subfieldModuleList[0].uid;
this.activeUid = component.uid;
this.subfieldModuleForm.subfieldModuleList[0].children.push(component);
} catch (error) {
}
},
onMove(e, originalEvent) {
try {
......@@ -171,16 +195,17 @@ export default {
}
},
resetCurrent() {
this.activeUid = "";
this.activeModuleId = "";
// 重置顺序不能变 (触发监听的顺序)
this.activeItemData = {};
this.activeItemDataOrigin = {};
this.activeUid = "";
this.activeModuleId = "";
},
// 克隆目标组件
targetComClone(v) {
console.log("clone", v);
const cloneTarget = JSON.parse(JSON.stringify(v));
const cloneTarget = cloneDeep(v);
cloneTarget.uid = v4();
console.log(cloneTarget);
cloneTarget.formAttribute.fieldName = this.generateRandomLowerCaseLetter() + cloneTarget.uid.split("-").join("");
return cloneTarget;
},
......@@ -201,11 +226,11 @@ export default {
},
// 取消当前焦点设置
cancelSetOptions() {
this.activeItemData = JSON.parse(JSON.stringify(this.activeItemDataOrigin));
this.activeItemData = cloneDeep(this.activeItemDataOrigin);
},
// 设置表单完成
setOptionsFinish(current, parentUid) {
const _temp = JSON.parse(JSON.stringify(current));
const _temp = cloneDeep(current);
_temp.checkedAllow = true;
const index = this.subfieldModuleForm.subfieldModuleList.findIndex(item => item.uid == parentUid);
if (index > -1) {
......@@ -216,9 +241,20 @@ export default {
}
}
},
// 回档数据
backfileData(current, parentUid) {
const _temp = cloneDeep(current);
const index = this.subfieldModuleForm.subfieldModuleList.findIndex(item => item.uid == parentUid);
if (index > -1) {
const childIndex = this.subfieldModuleForm.subfieldModuleList[index].children.findIndex(child => child.uid == current.uid);
if (childIndex > -1) {
this.subfieldModuleForm.subfieldModuleList[index].children.splice(childIndex, 1, _temp);
}
}
},
// 命中变化的表单元素
currentActiveByItemId(current) {
const _temp = JSON.parse(JSON.stringify(current));
const _temp = cloneDeep(current);
_temp.checkedAllow = false;
this.activeUid = current.uid;
this.activeItemData = _temp;
......@@ -229,7 +265,7 @@ export default {
},
// 添加分栏
addSubfieldModule() {
const _temp = JSON.parse(JSON.stringify(subfieldModuleTemplate));
const _temp = cloneDeep(subfieldModuleTemplate);
_temp.uid = v4();
this.moduleCount += 1;
_temp.defaultSubfieldModuleName = `分栏${this.moduleCount}`;
......@@ -251,7 +287,7 @@ export default {
},
// 编辑模块 更新title
editModule(module) {
const _temp = JSON.parse(JSON.stringify(module));
const _temp = cloneDeep(module);
const flag = this.onMove();
if (!flag) return;
const index = this.subfieldModuleForm.subfieldModuleList.findIndex(item => item.uid == _temp.uid);
......@@ -271,7 +307,7 @@ export default {
activeSubfieldItem(itemModule, parentUid) {
const flag = this.onMove();
if (!flag) return;
const _temp = JSON.parse(JSON.stringify(itemModule));
const _temp = cloneDeep(itemModule);
_temp.checkedAllow = false;
this.activeUid = _temp.uid;
this.activeModuleId = parentUid;
......
<template>
<div class="subfield-item-container" :class="{'is-active-subfield-item' : activeUid == comChildModuleInfo.uid}" :style="styles"
@click="activeSubfieldItem">
<div class="subfield-item-container" :class="classCreate(comChildModuleInfo.comType)" :style="styles" @click="activeSubfieldItem">
<img src="@/assets/images/consultingAgencyManagement/customForm/icon_drag@2x.png" alt="" class="subfield-module-item-dragg-target-icon">
<el-form-item class="subfield-module-form-item" :class="{'is-required' : comChildModuleInfo.formAttribute.required}"
<el-form-item class="subfield-module-form-item" :class="{'is-required': comChildModuleInfo.formAttribute.required}"
:label="comChildModuleInfo.formAttribute.label">
<!-- 输入框类型 -->
<!-- 单行文本类型 -->
<el-input v-model="comChildModuleInfo.componentAttribute.value" :placeholder="comChildModuleInfo.componentAttribute.placeholder" clearable
v-if="comChildModuleInfo.comType == 'el-input'"></el-input>
v-if="comChildModuleInfo.comType == 'text'" :disabled="isDisabled"></el-input>
<!-- 多行文本类型 -->
<el-input type="textarea" v-model="comChildModuleInfo.componentAttribute.value" :placeholder="comChildModuleInfo.componentAttribute.placeholder"
:show-word-limit="false" clearable v-if="comChildModuleInfo.comType == 'textarea'" :disabled="isDisabled"></el-input>
<!-- 下拉框类型 -->
<el-select v-model="comChildModuleInfo.componentAttribute.value" :multiple="comChildModuleInfo.formAttribute.isMultiple"
:collapse-tags="comChildModuleInfo.formAttribute.isMultiple" :placeholder="comChildModuleInfo.componentAttribute.placeholder"
v-if="comChildModuleInfo.comType == 'select'" :disabled="isDisabled">
<el-option v-for="(item,index) in comChildModuleInfo.formAttribute.selectOptions" :key="item.id" :label="item.value" :value="item.value">
</el-option>
</el-select>
<!-- 时间类型 -->
<el-date-picker v-model="comChildModuleInfo.componentAttribute.value" type="datetime" :value-format="'yyyy-MM-dd HH:mm:ss'"
:placeholder="comChildModuleInfo.componentAttribute.placeholder" :disabled="isDisabled" v-if="comChildModuleInfo.comType == 'date'">
</el-date-picker>
<!-- 电话类型 -->
<el-input v-model="comChildModuleInfo.componentAttribute.value" :placeholder="comChildModuleInfo.componentAttribute.placeholder" clearable
v-if="comChildModuleInfo.comType == 'phone'" :disabled="isDisabled"></el-input>
</el-form-item>
<img src="@/assets/images/consultingAgencyManagement/customForm/icon_delete@2x.png" alt="" class="remove-subfield-item-icon"
@click.stop="removeModuleItem">
</div>
</template>
<script>
import { cloneDeep } from "lodash-es";
export default {
name: "subfieldItem",
props: {
......@@ -23,25 +41,41 @@ export default {
watch: {
childModuleInfo: {
handler(newValue) {
this.comChildModuleInfo = JSON.parse(JSON.stringify(newValue));
this.comChildModuleInfo = cloneDeep(newValue);
this.comChildModuleInfoOriginData = cloneDeep(newValue);
},
deep: true
},
comChildModuleInfo: {
handler(newValue) {
console.log(this.comActiveUid !== this.comChildModuleInfo?.uid, "是否不是更改的当前元素");
if (this.comActiveUid !== this.comChildModuleInfo?.uid) return;
this.$mitt.emit("subfieldItemChange", newValue);
},
deep: true
},
activeUid: {
handler(newValue, oldValue) {
// 当前命中高亮的元素id 不跟当前元素uid相同 移除事件订阅 否者 添加订阅
this.addSubscription(newValue);
this.comActiveUid = newValue;
this.comOldActiveUid = oldValue;
},
// 保证首次触发 判断是否订阅
immediate: true
}
},
data() {
return {
comChildModuleInfo: JSON.parse(JSON.stringify(this.childModuleInfo)),
comChildModuleInfo: cloneDeep(this.childModuleInfo),
comChildModuleInfoOriginData: cloneDeep(this.childModuleInfo),
comActiveUid: this.activeUid,
comOldActiveUid: this.activeUid
};
},
//可访问data属性
created() {
this.$mitt.on("fieldOptionChange", this.setFieldOption);
},
beforeDestroy() {
this.$mitt.off("fieldOptionChange");
......@@ -52,18 +86,38 @@ export default {
return {
width: this.comChildModuleInfo.formAttribute ? `${this.comChildModuleInfo.formAttribute.width}%` : "100%"
};
},
isDisabled() {
return !(this.comActiveUid === this.comChildModuleInfo?.uid);
}
},
//方法集
methods: {
// 根据命中的id 来添加发布订阅
addSubscription(newValue) {
if (newValue === this.comChildModuleInfo.uid) return this.$mitt.on("fieldOptionChange", this.setFieldOption);
this.$mitt.off("fieldOptionChange");
},
classCreate(comType) {
const classParams = {
'is-active-subfield-item': this.comActiveUid == this.comChildModuleInfo.uid,
[`custom-subfielditem-${comType}`]: true
};
return classParams;
},
setFieldOption(value) {
// value.uid 等同于 comActiveUid (原因 : 能修改的元素一定是当前comActiveUid命中的元素,取value.uid 为了修改数据的严谨)
// 要修改的uid元素不是当前元素的id 不进行修改
// console.log(`${this.comChildModuleInfo?.uid} 当前组件元素uid`, `${value.uid} 当前需要触发修改数据的uid`);
if (value.uid !== this.comChildModuleInfo?.uid) return;
this.comChildModuleInfo = value;
},
removeModuleItem() {
this.$emit("removeModuleItem", this.comChildModuleInfo, this.parentUid);
},
activeSubfieldItem() {
if (this.activeUid == this.comChildModuleInfo?.uid) return;
if (this.comActiveUid == this.comChildModuleInfo?.uid) return;
this.$emit("activeSubfieldItem", this.comChildModuleInfo, this.parentUid);
}
},
......@@ -73,7 +127,7 @@ export default {
.subfield-item-container {
width: 100%;
min-height: 56px;
padding: 0px 16px 0px 32px;
padding: 12px 16px 12px 32px;
box-sizing: border-box;
display: flex;
align-items: center;
......@@ -112,5 +166,57 @@ export default {
margin-left: 12px;
cursor: pointer;
}
/* 多行文本样式 */
&.custom-subfielditem-textarea {
.subfield-module-item-dragg-target-icon {
align-self: flex-start;
margin-top: 4px;
}
.remove-subfield-item-icon {
align-self: flex-start;
margin-top: 4px;
}
::v-deep .subfield-module-form-item {
.el-form-item__label {
line-height: 22px;
}
.el-textarea {
.el-textarea__inner {
resize: unset;
min-height: 76px !important;
font-size: 14px;
font-family: Arial;
&::placeholder {
color: #c0c4cc !important;
font-size: 14px !important;
}
}
}
}
}
/* 下拉选择框 */
&.custom-subfielditem-select {
::v-deep .el-form-item {
.el-select {
width: 100%;
.el-input__inner {
border-radius: 2px;
}
}
}
}
// 时间选择样式
&.custom-subfielditem-date {
::v-deep .el-form-item {
.el-date-editor {
.el-input__prefix {
display: none;
}
}
}
}
}
</style>
......@@ -24,6 +24,7 @@
</div>
</template>
<script>
import { cloneDeep } from "lodash-es";
export default {
name: "subfieldModule",
props: {
......@@ -33,8 +34,9 @@ export default {
watch: {
moduleInfo: {
handler(newValue, oldValue) {
// console.log(this.comModuleInfo, "subfieldModule");
// 深克隆 避免未保存修改源数据 通过 订阅 editFinish事件处理更改源数据
this.comModuleInfo = JSON.parse(JSON.stringify(newValue));
this.comModuleInfo = cloneDeep(newValue);
},
deep: true
},
......@@ -48,7 +50,7 @@ export default {
return {
oldComModuleName: this.moduleInfo.subfieldModuleName,
// 深克隆 避免未保存修改源数据 通过 订阅 editFinish事件处理更改源数据
comModuleInfo: JSON.parse(JSON.stringify(this.moduleInfo)),
comModuleInfo: cloneDeep(this.moduleInfo),
comModuleIndex: this.moduleIndex
};
},
......
......@@ -47,12 +47,6 @@
<td class="table-key">项目承接类型</td>
<td>{{"-"}}</td>
</tr>
<tr>
<td class="table-key">投资来源</td>
<td>{{"-"}}</td>
<td class="table-key">项目承接类型</td>
<td>{{"-"}}</td>
</tr>
<tr>
<td class="table-key">合同签订日期</td>
<td>{{"-"}}</td>
......
......@@ -137,7 +137,7 @@
</div>
</template>
<script>
import { searchConsultingApi } from "@/api/consultingOrgManagement";
import { searchConsultingApi, getCustomFormDetailApi } from "@/api/consultingOrgManagement";
import { elementMessageSingleton } from "@/utils";
export default {
name: "consultingAgency",
......
......@@ -108,27 +108,27 @@ export default {
]
},
{ title: '财务简析', pathName: 'financial' },
{
title: '项目商机', pathName: '', children: [
{ title: '重点项目', pathName: 'majorProject' },
{ title: '土地交易', pathName: 'landtransaction' },
{ title: '拟建项目', pathName: 'proposed' },
{ title: '专项债项目', pathName: 'bond' },
{ title: '招标计划', pathName: 'biddingplan' },
{ title: '招标公告', pathName: 'announcement' },
{ title: '标讯Pro', pathName: 'tencent' },
{ title: '行政许可', pathName: 'administrative' }
]
},
{
title: '业务往来', pathName: '', children: [
{ title: '客户', pathName: 'custom' },
{ title: '供应商', pathName: 'supplier' },
{ title: '招标代理', pathName: 'bidagency' },
{ title: '历史发包', pathName: 'hiscontract' },
{ title: '开标记录', pathName: 'bidrecords' }
]
},
// {
// title: '项目商机', pathName: '', children: [
// { title: '重点项目', pathName: 'majorProject' },
// { title: '土地交易', pathName: 'landtransaction' },
// { title: '拟建项目', pathName: 'proposed' },
// { title: '专项债项目', pathName: 'bond' },
// { title: '招标计划', pathName: 'biddingplan' },
// { title: '招标公告', pathName: 'announcement' },
// { title: '标讯Pro', pathName: 'tencent' },
// { title: '行政许可', pathName: 'administrative' }
// ]
// },
// {
// title: '业务往来', pathName: '', children: [
// { title: '客户', pathName: 'custom' },
// { title: '供应商', pathName: 'supplier' },
// { title: '招标代理', pathName: 'bidagency' },
// { title: '历史发包', pathName: 'hiscontract' },
// { title: '开标记录', pathName: 'bidrecords' }
// ]
// },
{
title: '咨询业务往来', pathName: '', children: [
{ title: '常合作业主单位', pathName: 'cooperativeOwnerUnits' },
......@@ -136,13 +136,13 @@ export default {
{ title: '常合作集团', pathName: 'cooperativeGroup' },
]
},
{
title: '城投分析', pathName: '', children: [
{ title: '区域经济', pathName: 'regionalEconomies' },
{ title: '城投拿地', pathName: 'landAcquisition' },
{ title: '同地区城投', pathName: 'sameRegion' }
]
},
// {
// title: '城投分析', pathName: '', children: [
// { title: '区域经济', pathName: 'regionalEconomies' },
// { title: '城投拿地', pathName: 'landAcquisition' },
// { title: '同地区城投', pathName: 'sameRegion' }
// ]
// },
{
title: '风险信息', pathName: '', children: [
{ title: '行政处罚', pathName: 'punish' },
......@@ -192,27 +192,27 @@ export default {
]
},
{ title: '财务简析', pathName: 'financial' },
{
title: '项目商机', pathName: '', children: [
{ title: '重点项目', pathName: 'majorProject' },
{ title: '土地交易', pathName: 'landtransaction' },
{ title: '拟建项目', pathName: 'proposed' },
{ title: '专项债项目', pathName: 'bond' },
{ title: '招标计划', pathName: 'biddingplan' },
{ title: '招标公告', pathName: 'announcement' },
{ title: '标讯Pro', pathName: 'tencent' },
{ title: '行政许可', pathName: 'administrative' }
]
},
{
title: '业务往来', pathName: '', children: [
{ title: '客户', pathName: 'custom' },
{ title: '供应商', pathName: 'supplier' },
{ title: '招标代理', pathName: 'bidagency' },
{ title: '历史发包', pathName: 'hiscontract' },
{ title: '开标记录', pathName: 'bidrecords' }
]
},
// {
// title: '项目商机', pathName: '', children: [
// { title: '重点项目', pathName: 'majorProject' },
// { title: '土地交易', pathName: 'landtransaction' },
// { title: '拟建项目', pathName: 'proposed' },
// { title: '专项债项目', pathName: 'bond' },
// { title: '招标计划', pathName: 'biddingplan' },
// { title: '招标公告', pathName: 'announcement' },
// { title: '标讯Pro', pathName: 'tencent' },
// { title: '行政许可', pathName: 'administrative' }
// ]
// },
// {
// title: '业务往来', pathName: '', children: [
// { title: '客户', pathName: 'custom' },
// { title: '供应商', pathName: 'supplier' },
// { title: '招标代理', pathName: 'bidagency' },
// { title: '历史发包', pathName: 'hiscontract' },
// { title: '开标记录', pathName: 'bidrecords' }
// ]
// },
{
title: '咨询业务往来', pathName: '', children: [
{ title: '常合作业主单位', pathName: 'cooperativeOwnerUnits' },
......@@ -220,13 +220,13 @@ export default {
{ title: '常合作集团', pathName: 'cooperativeGroup' },
]
},
{
title: '城投分析', pathName: '', children: [
{ title: '区域经济', pathName: 'regionalEconomies' },
{ title: '城投拿地', pathName: 'landAcquisition' },
{ title: '同地区城投', pathName: 'sameRegion' }
]
},
// {
// title: '城投分析', pathName: '', children: [
// { title: '区域经济', pathName: 'regionalEconomies' },
// { title: '城投拿地', pathName: 'landAcquisition' },
// { title: '同地区城投', pathName: 'sameRegion' }
// ]
// },
{
title: '风险信息', pathName: '', children: [
{ title: '行政处罚', pathName: 'punish' },
......
......@@ -93,7 +93,7 @@ export default {
cooperationRecordDialog: false,
dialogQueryParams: {
companyId: this.companyId,
combineId: "",
combineName: "",
pageNum: 1,
pageSize: 10,
companyType: 2,
......@@ -264,7 +264,7 @@ export default {
}
},
viewProject(row) {
this.dialogQueryParams.combineId = row.counterpartCompanyId;
this.dialogQueryParams.combineName = row.counterpartCompanyName;
this.cooperationRecordDialog = true;
},
async dialogHandleQurey(params) {
......
......@@ -133,11 +133,11 @@ export default {
// { label: '合作总金额(万元)', prop: 'amount', minWidth: '226', align: "right", sortable: "custom" },
],
formData: [
{ type: 4, fieldName: 'businessTypes', value: '', placeholder: '咨询机构业务', options: [], uid: this.getUid() },
{ type: 4, fieldName: 'counterpartCompanyRoles', value: '', placeholder: '合作项目类型', options: [], uid: this.getUid() },
{ type: 4, fieldName: 'projectTypes', value: '', placeholder: '合作工程类型', options: [], uid: this.getUid() },
{ type: 5, fieldName: 'time', value: '', placeholder: '合作频率', startTime: 'beginTime', endTime: 'endTime', uid: this.getUid() },
{ type: 6, fieldName: 'money', value: '', placeholder: '合作金额', uid: this.getUid() },
// { type: 4, fieldName: 'businessTypes', value: '', placeholder: '咨询机构业务', options: [], uid: this.getUid() },
// { type: 4, fieldName: 'counterpartCompanyRoles', value: '', placeholder: '合作项目类型', options: [], uid: this.getUid() },
// { type: 4, fieldName: 'projectTypes', value: '', placeholder: '合作工程类型', options: [], uid: this.getUid() },
// { type: 5, fieldName: 'time', value: '', placeholder: '合作频率', startTime: 'beginTime', endTime: 'endTime', uid: this.getUid() },
// { type: 6, fieldName: 'money', value: '', placeholder: '合作金额', uid: this.getUid() },
{ type: 3, fieldName: 'keyword', value: '', placeholder: '请输入', uid: this.getUid() },
],
//列表
......@@ -149,8 +149,8 @@ export default {
cooperationRecordDialog: false,
dialogQueryParams: {
companyId: this.companyId,
memberId: "",
combineId: "",
memberName: "",
combineName: "",
pageNum: 1,
pageSize: 10,
companyType: 3,
......@@ -329,21 +329,21 @@ export default {
}
},
viewProject(row) {
this.dialogQueryParams.memberId = row.combineId;
this.dialogQueryParams.combineId = row.combineId;
this.dialogQueryParams.memberName = row.combineName;
this.dialogQueryParams.combineName = row.combineName;
this.cooperationRecordDialog = true;
},
async dialogHandleQurey(params) {
try {
let data = params ? params : this.dialogQueryParams;
const _tempData = JSON.parse(JSON.stringify(data));
this.currentList == "cooperativeMember" ? delete _tempData.memberId : delete _tempData.memberId;
this.currentList == "cooperativeMember" ? delete _tempData.memberName : delete _tempData.memberName;
this.dialogIsSkeleton = true;
const res = this.currentList == "cooperativeMember" ? await getCooperativeGroupMemberApi(_tempData) : await getCooperativeOwnerUnitsDetailApi(_tempData);
this.dialogTableData = res.rows ? res.rows : [];
this.dialogtableDataTotal = res.total ? res.total : 0;
const dialogData = JSON.parse(JSON.stringify(data));
delete dialogData.memberId;
delete dialogData.memberName;
const count = await getCooperativeOwnerUnitsCountAmountApi(dialogData);
if (count.code == 200 && count.data) {
this.statisticsData = count.data;
......@@ -380,12 +380,12 @@ export default {
try {
const params = this.createQueryCondition(this.dialogFormData);
const searchParams = JSON.parse(JSON.stringify({ ...params, ...this.dialogQueryParams }));
this.currentList == "cooperativeMember" ? delete searchParams.memberId : delete searchParams.memberId;
this.currentList == "cooperativeMember" ? delete searchParams.memberName : delete searchParams.memberName;
const res = this.currentList == "cooperativeMember" ? await getCooperativeGroupMemberApi(searchParams) : await getCooperativeOwnerUnitsDetailApi(searchParams);
this.dialogTableData = res.rows ? res.rows : [];
this.dialogtableDataTotal = res.total ? res.total : 0;
const dialogData = JSON.parse(JSON.stringify(this.dialogQueryParams));
delete dialogData.memberId;
delete dialogData.memberName;
const count = await getCooperativeOwnerUnitsCountAmountApi(dialogData);
if (count.code == 200 && count.data) {
this.statisticsData = count.data;
......
......@@ -93,7 +93,7 @@ export default {
cooperationRecordDialog: false,
dialogQueryParams: {
companyId: this.companyId,
combineId: "",
combineName: "",
pageNum: 1,
pageSize: 10,
companyType: 1,
......@@ -264,7 +264,7 @@ export default {
}
},
viewProject(row) {
this.dialogQueryParams.combineId = row.companyId;
this.dialogQueryParams.combineName = row.companyName;
this.cooperationRecordDialog = true;
},
async dialogHandleQurey(params) {
......
......@@ -183,9 +183,9 @@ export default {
showMore: false,
showState: false,
graphList: [
{ id: 1, name: '业务往来', isShow: true, intro: [{ id: 101, name: '客户', val: 0, category: 'global', field: 'customerV1' }, { id: 102, name: '供应商', val: 0, category: 'global', field: 'supplierV1' }], ico: require('@/assets/images/detail/overview/company_ywwl.png') },
// { id: 1, name: '业务往来', isShow: true, intro: [{ id: 101, name: '客户', val: 0, category: 'global', field: 'customerV1' }, { id: 102, name: '供应商', val: 0, category: 'global', field: 'supplierV1' }], ico: require('@/assets/images/detail/overview/company_ywwl.png') },
{ id: 2, name: '商机线索', isShow: true, intro: [{ id: 201, name: '专项债项目', val: 0, category: 'performance', field: 'specialDebt' }, { id: 202, name: '招标计划', val: 0, category: 'performance', field: 'bidPlan' }], ico: require('@/assets/images/detail/overview/company_sjxs.png') },
{ id: 3, name: '城投拿地', isShow: true, intro: [{ id: 301, name: '土地交易', val: 0, category: 'global', field: 'landInfo' }, { id: 302, name: '行政许可', val: 0, category: 'business', field: 'adminLicensing' }], ico: require('@/assets/images/detail/overview/company_ctnd.png') },
// { id: 3, name: '城投拿地', isShow: true, intro: [{ id: 301, name: '土地交易', val: 0, category: 'global', field: 'landInfo' }, { id: 302, name: '行政许可', val: 0, category: 'business', field: 'adminLicensing' }], ico: require('@/assets/images/detail/overview/company_ctnd.png') },
{ id: 4, name: '对外投资', isShow: true, intro: [{ id: 401, name: '企业经营实力展现' }], ico: require('@/assets/images/detail/overview/company_dwtz.png') },
{ id: 5, name: '股权穿透', isShow: true, intro: [{ id: 501, name: '瞬息掌握企业关系' }], ico: require('@/assets/images/detail/overview/company_gqct.png') },
{ id: 6, name: '企业架构', isShow: true, intro: [{ id: 601, name: '企业架构关联图' }], ico: require('@/assets/images/detail/overview/company_qyjg.png') },
......
<template>
<div class="app-container part-container">
<div class="view-content"><skeleton style="margin-left:16px;" v-if="isSkeleton"></skeleton><Infoheader v-else :companyId="companyId" :companyInfo="companyInfo" :statistic="statistic" /></div><!-- 企业信息 -->
<div class="view-content"><Operations :companyId="companyId" :financial="financial" /></div><!-- 公司经营 -->
<div class="view-content"><Bidding :companyId="companyId" /></div><!--招标偏好、业务往来-->
<div class="view-content"><Busclue :companyId="companyId" :statistic="statistic" /></div><!--商机线索-->
<div class="view-content"><Finance :companyId="companyId" /></div><!--财务数据-->
<!-- <div class="view-content"><Operations :companyId="companyId" :financial="financial" /></div>公司经营 -->
<!-- <div class="view-content"><Bidding :companyId="companyId" /></div>招标偏好、业务往来 -->
<!-- <div class="view-content"><Busclue :companyId="companyId" :statistic="statistic" /></div>商机线索 -->
<!-- <div class="view-content"><Finance :companyId="companyId" /></div>财务数据 -->
<div class="view-content"><Relationship :companyId="companyId" :financial="financial" /></div><!--关系企业-->
<div class="view-content"><Senior :companyId="companyId" /></div><!--高管-->
<div class="view-content"><Risk :companyId="companyId" :statistic="statistic" /></div><!--风险概览-->
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment