From a4a24d2ba204a8a66ed12628615f4da7e9bc773d Mon Sep 17 00:00:00 2001 From: herenshan112 Date: Thu, 4 Jul 2024 15:50:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9hr=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/hr/people/index.ts | 16 ++-- src/components/DesignForm/assembly/index.ts | 52 +++++++++++- src/components/DesignForm/dragControlApp.vue | 2 +- .../DesignForm/formControlPropertiNew.vue | 70 +++++++++------- .../DesignForm/formControlProperties.vue | 2 +- src/views/hr/archives/archivescont.vue | 33 ++++---- .../basicinformation/appraisalrecord.vue | 43 +++++++--- .../basicinformation/certificates.vue | 24 +++++- .../basicinformation/charactercolor.vue | 2 +- .../basicinformation/employmentrelations.vue | 80 ++++++++++++------- .../hr/archives/basicinformation/jobtitle.vue | 28 ++++--- .../rewardsandpunishments.vue | 45 ++++++++--- .../basicinformation/talentinventory.vue | 56 ++++++------- .../appPage/appPageForm/pageForm.vue | 44 +++++----- 14 files changed, 327 insertions(+), 170 deletions(-) diff --git a/src/api/hr/people/index.ts b/src/api/hr/people/index.ts index d485bedea..520b2b513 100644 --- a/src/api/hr/people/index.ts +++ b/src/api/hr/people/index.ts @@ -464,9 +464,9 @@ export function getCharacterColor(data?: contNumber):any { } // 获取奖惩记录 -export function getRewardsAndPunishmentsCont(data?: contId) { +export function getRewardsAndPunishmentsCont(data?: any) { return request({ - url: '/hrapi/', + url: '/hrapi/staff/rewPunList', method: 'post', data: data }) @@ -496,9 +496,9 @@ export function editRewardsAndPunishmentsContState(data?: delJjlxr) { }) } //获取考评记录 -export function getAppraisalrecordCont(data?: contId) { +export function getAppraisalrecordCont(data?: any) { return request({ - url: '/hrapi/', + url: '/hrapi/staff/assessmentRecords', method: 'post', data: data }) @@ -563,7 +563,7 @@ export function editTalentinventoryContState(data?: delJjlxr) { //获取用工关系 export function getEmploymentrelationsCont(data?: contId) { return request({ - url: '/hrapi/', + url: '/hrapi/staff/peopleEmploymentRelationship', method: 'post', data: data }) @@ -595,7 +595,7 @@ export function editEmploymentrelationsContState(data?: delJjlxr) { //获取职称信息 export function getJobtitleCont(data?: contId) { return request({ - url: '/hrapi/', + url: '/hrapi/staff/peopleTitle', method: 'post', data: data }) @@ -625,9 +625,9 @@ export function editJobtitleContState(data?: delJjlxr) { }) } //获取证书信息 -export function getCertificatesCont(data?: contId) { +export function getCertificatesCont(data?: any) { return request({ - url: '/hrapi/', + url: '/hrapi/staff/peopleHonor', method: 'post', data: data }) diff --git a/src/components/DesignForm/assembly/index.ts b/src/components/DesignForm/assembly/index.ts index bae2541ea..dbaa18b4e 100644 --- a/src/components/DesignForm/assembly/index.ts +++ b/src/components/DesignForm/assembly/index.ts @@ -23,6 +23,7 @@ export default [ { type: 'title', label: '标题', + unitName: '标题', icon: 'title', iconFont: 'fa-header', control: { @@ -38,6 +39,7 @@ export default [ { type: 'digitpage', label: '数值', + unitName: '数值', icon: 'money', iconFont: 'fa-money', control: { @@ -62,6 +64,7 @@ export default [ { type: 'input', label: '单行文本', + unitName: '单行文本', icon: 'input', iconFont: 'fa-text-width', control: { @@ -79,6 +82,7 @@ export default [ { type: 'textarea', label: '多行文本', + unitName: '多行文本', icon: 'textarea', iconFont: 'fa-text-height', control: { @@ -94,6 +98,7 @@ export default [ { type: 'radio', label: '单选框组', + unitName: '单选框组', icon: 'radio', iconFont: 'fa-dot-circle-o', control: { @@ -113,6 +118,7 @@ export default [ { type: 'checkbox', label: '多选框组', + unitName: '多选框组', icon: 'checkbox', iconFont: 'fa-check-square-o', control: { @@ -132,6 +138,7 @@ export default [ { type: 'select', label: '下拉选择框', + unitName: '下拉选择框', icon: 'select', iconFont: 'fa-toggle-down', control: { @@ -152,6 +159,7 @@ export default [ { type: 'cascader', label: '级联选择器', + unitName: '级联选择器', icon: 'cascader', iconFont: 'fa-sitemap', control: { @@ -168,6 +176,7 @@ export default [ { type: 'datePicker', label: '日期选择器', + unitName: '日期选择器', icon: 'todo', iconFont: 'fa-calendar', control: { @@ -184,6 +193,7 @@ export default [ { type: 'timePicker', label: '时间选择器', + unitName: '时间选择器', icon: 'time', iconFont: 'fa-clock-o', control: { @@ -199,6 +209,7 @@ export default [ { type: 'txt', label: '文字描述', + unitName: '文字描述', icon: 'text', iconFont: 'fa-file-word-o', control: { @@ -214,6 +225,7 @@ export default [ { type: 'organization', label: '联系地址', + unitName: '联系地址', icon: 'marker', iconFont: 'fa-map-marker', control: { @@ -228,6 +240,7 @@ export default [ { type: 'switch', label: '开关', + unitName: '开关', icon: 'switch', iconFont: 'fa-toggle-on', control: { @@ -255,11 +268,13 @@ export default [ { type: 'button', label: '按钮', + unitName: '按钮', icon: 'button', iconFont: 'fa-square-o', control: { - label: '保存' + label: '保存', }, + config: {}, styles: { divStyle: {}, @@ -270,6 +285,7 @@ export default [ { type: 'inputNumber', label: '计数器', + unitName: '计数器', icon: 'number', iconFont: 'fa-sort-numeric-asc', control: { @@ -285,6 +301,7 @@ export default [ { type: 'description', label: '描述说明', + unitName: '描述说明', icon: 'number', iconFont: 'fa-question-circle-o', control: { @@ -314,6 +331,7 @@ export default [ { type: 'grid', label: '格栅布局', + unitName: '格栅布局', icon: 'grid', iconFont: 'fa-th-large', columns: [ @@ -338,6 +356,7 @@ export default [ { type: 'card', label: '卡片布局', + unitName: '卡片布局', icon: 'card', iconFont: 'fa-credit-card', list: [], @@ -353,6 +372,7 @@ export default [ { type: 'flex', label: '弹性布局', + unitName: '弹性布局', icon: 'flex', iconFont: 'fa-file-text-o', list: [], @@ -370,6 +390,7 @@ export default [ { type: 'div', label: '容器', + unitName: '容器', icon: 'div', iconFont: '', control: {}, @@ -384,11 +405,13 @@ export default [ { type: 'tabs', label: '标签页', + unitName: '标签页', icon: 'tabs', iconFont: 'fa-folder-o', columns: [ { label: 'Tab1', + unitName: '', list: [] } ], @@ -404,6 +427,7 @@ export default [ { type: 'divider', label: '分割线', + unitName: '分割线', icon: 'divider', iconFont: '', control: {}, @@ -424,6 +448,7 @@ export default [ { type: 'lowcodeImage', label: '图片', + unitName: '图片', icon: '', iconFont: 'fa-photo', control: { @@ -457,6 +482,7 @@ export default [ { type: 'videoUpAndPlay', label: '视频', + unitName: '视频', icon: '', iconFont: 'fa-play-circle', control: { @@ -493,6 +519,7 @@ export default [ type: 'upload', label: '文件', + unitName: '文件', icon: 'image', iconFont: 'fa-file-image-o', control: { @@ -509,6 +536,7 @@ export default [ { type: 'urllink', label: '链接', + unitName: '链接', icon: 'link', iconFont: 'fa-link', control: { @@ -523,6 +551,7 @@ export default [ { type: 'table', label: '子表', + unitName: '子表', icon: 'table', iconFont: 'fa-table', list: [], @@ -542,6 +571,7 @@ export default [ { type: 'baidumap', label: '地图', + unitName: '地图', icon: 'map', iconFont: 'fa-map-o', control: { @@ -556,6 +586,7 @@ export default [ { type: 'slider', label: '滑块', + unitName: '滑块', icon: 'slider', iconFont: 'fa-sliders', control: { @@ -571,6 +602,7 @@ export default [ { type: 'rate', label: '评分', + unitName: '评分', icon: 'rate', iconFont: 'fa-star-o', control: { @@ -586,6 +618,7 @@ export default [ { type: 'tinymce', label: '富文本', + unitName: '富文本', icon: 'tinymce',// iconFont: 'fa-list-alt', control: { @@ -601,6 +634,7 @@ export default [ { type: 'lowcodeCarsusel', label: '轮播图', + unitName: '轮播图', icon: '', iconFont: 'fa-window-restore', control: { @@ -630,6 +664,7 @@ export default [ { type: 'signaturemap', label: '签名板', + unitName: '签名板', icon: 'faedit', iconFont: 'fa-edit', control: { @@ -644,6 +679,7 @@ export default [ { type: 'lowcodeTransfer', label: '穿梭框', + unitName: '穿梭框', icon: '', iconFont: 'fa-arrows-h', control: { @@ -651,12 +687,14 @@ export default [ fixedOptions: [{ id: 'thefirstrootnode', label: '根节点1', + unitName: '', disabled: false, children: [] }, { id: 'thesecondrootnode', label: '根节点2', + unitName: '', disabled: false, children: [] }] @@ -672,6 +710,7 @@ export default [ type: 'colorPicker', label: '取色器', + unitName: '取色器', icon: 'color', iconFont: '', control: { @@ -687,6 +726,7 @@ export default [ { type: 'treeSelect', label: '树形控件', + unitName: '树形控件', icon: 'tree2', iconFont: '', control: { @@ -706,6 +746,7 @@ export default [ { type: 'associatedForms', label: '关联表单', + unitName: '关联表单', icon: '', iconFont: 'fa-wpforms', control: { @@ -730,6 +771,7 @@ export default [ { type: 'component', label: '自定义组件', + unitName: '自定义组件', icon: 'component', iconFont: 'fa-cubes', control: { @@ -761,6 +803,7 @@ export default [ { type: 'serialNumber', label: '编码', + unitName: '编码', icon: 'number', iconFont: 'fa-list-ol', control: { @@ -777,6 +820,7 @@ export default [ { type: 'expand-user', label: '选择用户', + unitName: '选择用户', icon: 'user', iconFont: 'fa-user-o', control: { @@ -793,6 +837,7 @@ export default [ { type: 'orgCentent', label: '选择组织', + unitName: '选择组织', icon: 'sliders', iconFont: 'fa-sliders', control: { @@ -807,6 +852,7 @@ export default [ { type: 'founder', label: '创建人', + unitName: '创建人', icon: 'number', iconFont: 'fa-user-circle-o', control: { @@ -822,6 +868,7 @@ export default [ { type: 'founderTime', label: '创建时间', + unitName: '创建时间', icon: 'number', iconFont: 'fa-clock-o', control: { @@ -837,6 +884,7 @@ export default [ { type: 'editTime', label: '修改时间', + unitName: '修改时间', icon: 'number', iconFont: 'fa-clock-o', control: { @@ -852,6 +900,7 @@ export default [ { type: 'owner', label: '拥有者', + unitName: '拥有者', icon: 'number', iconFont: 'fa-user-circle', control: { @@ -867,6 +916,7 @@ export default [ { type: 'deptOrg', label: '所属部门', + unitName: '所属部门', icon: 'number', iconFont: 'fa-group', control: { diff --git a/src/components/DesignForm/dragControlApp.vue b/src/components/DesignForm/dragControlApp.vue index 5414cd498..29870724f 100644 --- a/src/components/DesignForm/dragControlApp.vue +++ b/src/components/DesignForm/dragControlApp.vue @@ -73,7 +73,7 @@ const emits = defineEmits<{ @ 功能: 启用和禁用版本 */ const enableOrDisable = (val?:any) =>{ - console.log("启用和禁用版本",val) + // console.log("启用和禁用版本",val) emits('versionUpdateForm', val) } /** diff --git a/src/components/DesignForm/formControlPropertiNew.vue b/src/components/DesignForm/formControlPropertiNew.vue index 169c7d561..472a69b6b 100644 --- a/src/components/DesignForm/formControlPropertiNew.vue +++ b/src/components/DesignForm/formControlPropertiNew.vue @@ -204,7 +204,7 @@ const formAttr = computed(() => { ] }) const attrList = computed(() => { - // console.log("controlData.value-1-->",controlData.value) + console.log("controlData.value-1-->",controlData.value) if (Object.keys(controlData.value).length) { const { control = {}, @@ -214,10 +214,11 @@ const attrList = computed(() => { item = {}, attr = {}, selectvalue = "default", - mathFormula = {} - }: { control: any;type:any;name:any;item:any;attr:any; config: any,selectvalue:any,mathFormula:any } = controlData.value - // console.log("controlData.value--->",controlData.value) - // console.log("controlData.value-1-->",control,selectvalue) + mathFormula = {}, + unitName + }: { control: any;type:any;name:any;item:any;attr:any; config: any,selectvalue:any,mathFormula:any,unitName:any } = controlData.value + console.log("controlData.value--->",controlData.value) + console.log("controlData.value-1-->",unitName) let columnIndex = false // 是否显示序号列 if (type === 'table') { // 表格时处理 @@ -228,6 +229,12 @@ const attrList = computed(() => { } const temp =reactive([ + { + label: '组件类型', + value: unitName, + placeholder: '组件类型', + path: 'unitName' + }, { label: '自定义Class', value: config.className, @@ -1387,7 +1394,7 @@ const tableColumnAdd = (val: string) => { // 校验规则必填勾选设置,存在校验规则时勾选 const checkboxRequired = computed(() => { const val = controlData.value && controlData.value.item?.rules - console.log("校验规则必填勾选设置",val && val.length > 0) + // console.log("校验规则必填勾选设置",val && val.length > 0) if(val && val.length > 0){ return true }else{ @@ -1540,7 +1547,7 @@ const eventClick = (type: string, tooltip?: string) => { defineExpose({ getFormFieldBySource }) //判断输入框是否可写 const isNotWrite = (val:any) =>{ - console.log("判断输入框是否可写--->",val,props.customerformid) + // console.log("判断输入框是否可写--->",val,props.customerformid) if(val.key === "name" && props.customerformid != ""){ return true } @@ -1586,13 +1593,13 @@ const updataDigit = (key:string,val:any) => { // console.log("默认值处理-1-->",props.formList) // console.log("默认值处理-2-->",props.formConfig) // console.log("默认值处理--3->",props.formOtherData) - console.log("默认值处理--4->",val) + // console.log("默认值处理--4->",val) formConfig.value[key] = { mathsFormula:val.mathsFormula, takingMethod:val.takingMethod, digit:val.digit } - console.log("返回值处理--->",formConfig.value) + // console.log("返回值处理--->",formConfig.value) attrList.value.forEach((item:any)=>{ // console.log("返回值处理--1->",item) if(item.type == "digitpage"){ @@ -1652,7 +1659,7 @@ const videoIndex = ref(0); //上传失败钩子 function videoUploadErr(error: Error, uploadFile: UploadFile, uploadFiles: UploadFiles){ alert("上传失败,请重试") - console.log("上传失败"+error); + // console.log("上传失败"+error); } //liwenxuan 20240108 vidioupload end @@ -1684,9 +1691,9 @@ const showImagePreview = ref(false) if(controlData.value.type==='lowcodeCarsusel'){ const carsuselConfigData:CarsuselConfig[] = controlData.value.control.carsuselConfigArr carsuselConfigData.forEach(element => { - //console.log(element) + // console.log(element) if(element.imgId==''){ - //console.log("初始化imgid") + // console.log("初始化imgid") let onlyNumber = uuidv4().replaceAll('-','').toString(); //获取唯一编码 element.imgId = onlyNumber; } @@ -1695,21 +1702,21 @@ const showImagePreview = ref(false) controlData.value.control.fillRoles[0].id = uuidv4().replaceAll('-','').toString(); } //实现关联表单设置可选字段中没有当前字段效果 start - //console.log(controlData.value.name) + // console.log(controlData.value.name) resDataForGlxxszExceptself1 = JSON.parse(JSON.stringify(resDataForGlxxszExceptself)); - //console.log(resDataForGlxxszExceptself1) + // console.log(resDataForGlxxszExceptself1) for(let i = 0;i item.label == data.treeAttrs.onlyToShowTableId ) arr = arr[0].children - //console.log(arr) + // console.log(arr) asfasfFieldTreeOptionsValue3.value = [{ id: 'rootid_'+data.label, label: '关联的表单-'+data.label, @@ -2075,9 +2082,9 @@ let resDataForGlxxszExceptself: any[] = [] let resDataForGlxxszExceptself1: any[] = [] let getAssociatedFormsCurrentFieldTreeData:any getAssociatedFormsCurrentFieldTree().then(({ data }) => { - //console.log(data) + // console.log(data) getAssociatedFormsCurrentFieldTreeData = JSON.parse(JSON.stringify(data)) - //console.log(getAssociatedFormsCurrentFieldTreeData) + // console.log(getAssociatedFormsCurrentFieldTreeData) if(data.id==="cfid为空"){ //alert("cfid为空") }else{ @@ -2095,7 +2102,7 @@ getAssociatedFormsCurrentFieldTree().then(({ data }) => { resDataForGlxxszExceptself = JSON.parse(JSON.stringify(resDataForGlxxsz.value)); - //console.log(resDataForGlxxszExceptself) + // console.log(resDataForGlxxszExceptself) @@ -2147,7 +2154,7 @@ getAssociatedFormsOrgAndManTree().then(({ data }) => { const roleTree = ref() getAssociatedFormsRoleTree().then(({ data }) => { let resData = ref(data.children) - //console.log("roleTree=============="+resData.value); + // console.log("roleTree=============="+resData.value); roleTree.value = [{ id: data.id, //label: data.label, @@ -2545,7 +2552,7 @@ function handleDetermineoptionsValue3(){ ] const layouytStyle = reactive(controlData.value.styles) watch(()=>layouytStyle,(val : any)=>{ - console.log("监听样式处理",val) + // console.log("监听样式处理",val) controlData.value.styles = val // Object.assign(store.controlAttr.styles.divStyle, val) }, @@ -2582,7 +2589,7 @@ const handleAvatarSuccess: UploadProps['onSuccess'] = ( } const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => { - console.log("beforeAvatarUpload",rawFile.type) + // console.log("beforeAvatarUpload",rawFile.type) if (rawFile.type !== 'image/jpeg' && rawFile.type !== 'image/jpg' && rawFile.type !== 'image/png' && rawFile.type !== 'image/gif' && rawFile.type !== 'image/icon') { ElMessage.error('请上传以下格式的图片(jpg、jpeg、png、gif、icon)!'+rawFile.type) return false @@ -2612,7 +2619,7 @@ const gainFormGroupList = () =>{ } customerFormGroupList(sendInfo) .then((data)=>{ - console.log("获取表单分组",data) + // console.log("获取表单分组",data) formGroup.value = data.data }) .finally(()=>{ @@ -2691,7 +2698,7 @@ const disabledIstrue = (val:string) => { 通用属性 diff --git a/src/views/hr/archives/basicinformation/charactercolor.vue b/src/views/hr/archives/basicinformation/charactercolor.vue index 9d0f2760c..8a6381917 100644 --- a/src/views/hr/archives/basicinformation/charactercolor.vue +++ b/src/views/hr/archives/basicinformation/charactercolor.vue @@ -127,7 +127,7 @@ watch( }), async (newValues) => { const { usercont, tabsid } = newValues; - // 如果tabsid为'2'且usercont.number准备好了 + // 如果tabsid为'2'且usercont.number准备好了 props.tabsid if (tabsid === '2' && usercont.number) { error.value = null; await nextTick(); diff --git a/src/views/hr/archives/basicinformation/employmentrelations.vue b/src/views/hr/archives/basicinformation/employmentrelations.vue index ac6419147..9c3894bc6 100644 --- a/src/views/hr/archives/basicinformation/employmentrelations.vue +++ b/src/views/hr/archives/basicinformation/employmentrelations.vue @@ -31,7 +31,7 @@ const props = defineProps({ const addyggxBoxPage = ref(false); const edityggxBoxPage = ref(false); const tableLoading = ref(false); -const yggxList = ref([]); +const yggxList = ref([]); const yggxInfo = ref(); const getyggxList = () => { tableLoading.value = true; @@ -49,7 +49,7 @@ const getyggxList = () => { watch( () => props.tabsid, () => { - if (props.tabsid == "4") { + if (props.tabsid == "13") { getyggxList(); } } @@ -95,32 +95,58 @@ const delyggxBox = (cont: yonggongguanxi) => { :datacont="yggxInfo" @restdata="getyggxList" /> - - - - - - - - - + diff --git a/src/views/hr/archives/basicinformation/rewardsandpunishments.vue b/src/views/hr/archives/basicinformation/rewardsandpunishments.vue index 5a2bed42e..3970b8e7e 100644 --- a/src/views/hr/archives/basicinformation/rewardsandpunishments.vue +++ b/src/views/hr/archives/basicinformation/rewardsandpunishments.vue @@ -28,15 +28,27 @@ const props = defineProps({ }); const addJcjlBoxPage = ref(false); const editJcjlBoxPage = ref(false); +const searchAry = reactive({ + id:props.usercont.keystr, + page:1, + pagesize:10, + state:0 +}) + +const totalVal = ref(0) const tableLoading = ref(false); -const jcjlList = ref([]); +const jcjlList = ref([]); const jcjlInfo = ref(); -const getjcjlList = () => { +const getRewPunList = () => { tableLoading.value = true; - getRewardsAndPunishmentsCont({ id: props.usercont.keystr }) + console.log("奖惩记录",props.usercont) + searchAry.id = props.usercont.keystr; + getRewardsAndPunishmentsCont(searchAry) .then((data) => { - jcjlList.value = data.data; + console.log("奖惩记录",data) + jcjlList.value = data.data.list; + totalVal.value = data.data.total }) .finally(() => { tableLoading.value = false; @@ -48,8 +60,8 @@ const getjcjlList = () => { watch( () => props.tabsid, () => { - if (props.tabsid == "6") { - getjcjlList(); + if (props.tabsid == "10") { + getRewPunList(); } } ); @@ -105,11 +117,11 @@ const delJcjlBox = (cont: jiangchengjilu) => { border :header-cell-style="{ background: '#F5F7FA' }" > - - - - - + + + + + +
+ +
- + diff --git a/src/views/hr/archives/basicinformation/talentinventory.vue b/src/views/hr/archives/basicinformation/talentinventory.vue index ad5330118..ba1a54e1e 100644 --- a/src/views/hr/archives/basicinformation/talentinventory.vue +++ b/src/views/hr/archives/basicinformation/talentinventory.vue @@ -24,30 +24,37 @@ const props = defineProps({ }, }, }); -const editrcpdBoxPage = ref(false); -const addrcpdBoxPage = ref(false); +const peopd = reactive([{ + zy:props.usercont.careerPlanning, + bz:props.usercont.helpObtained +}]) +// const editrcpdBoxPage = ref(false); +// const addrcpdBoxPage = ref(false); -const tableLoading = ref(false); -const rcpdList = ref([]); -const rcpdInfo = ref(); -const getrcpdList = () => { - tableLoading.value = true; - getTalentinventoryCont({ id: props.usercont.keystr }) - .then((data) => { - rcpdList.value = data.data; - }) - .finally(() => { - tableLoading.value = false; - }); -}; +// const tableLoading = ref(false); +// const rcpdList = ref([]); +// const rcpdInfo = ref(); +// const getrcpdList = () => { +// tableLoading.value = true; +// getTalentinventoryCont({ id: props.usercont.keystr }) +// .then((data) => { +// rcpdList.value = data.data; +// }) +// .finally(() => { +// tableLoading.value = false; +// }); +// }; /** * 监听数据 */ watch( () => props.tabsid, () => { - if (props.tabsid == "3") { - getrcpdList(); + if (props.tabsid == "12") { + // getrcpdList(); + // console.log("人员全部西悉尼",props.usercont) + peopd.zy=props.usercont.careerPlanning + peopd.bz=props.usercont.helpObtained } } ); @@ -97,22 +104,15 @@ const delrcpdBox = (cont: rencaipandian) => { - - + +