13 次代碼提交 9feee8531f ... b73ad87c0d

作者 SHA1 備註 提交日期
  单文琦 b73ad87c0d Merge branch 'master' into 单-缺陷修正 2 年之前
  NanMing 908994b2f2 Merge branch 'test' of sckj/mz-cloud into master 2 年之前
  sckj 5c8c0b476c Merge branch '王立生' of sckj/mz-cloud into master 2 年之前
  skcj 26902720c1 嵌入式养老机构查询 2 年之前
  nanMing 16d92e7952 校验问题 2 年之前
  sckj 7e633f3f91 Merge branch '王立生' of sckj/mz-cloud into master 2 年之前
  skcj 3902e78a8d 嵌入式养老机构查询 2 年之前
  NanMing 1fae4a3a9f Merge branch 'test' of sckj/mz-cloud into master 2 年之前
  nanMing 14c0cbe4c0 适老化改造完善 2 年之前
  sunkuosheng521 453a807802 Merge branch '数字组件和五级联动组件' of sckj/mz-cloud into master 2 年之前
  sunkuosheng a49f033ff0 请求地址修改 2 年之前
  sunkuosheng521 77b35b5370 Merge branch '数字组件和五级联动组件' of sckj/mz-cloud into master 2 年之前
  sunkuosheng 7865414608 数字组件和五级联动组件 2 年之前

+ 7 - 0
ruoyi-web/src/api/home.js

@@ -238,3 +238,10 @@ export function getOrderOrgResult(query) {
     params: query
   })
 }
+export const countryDeptList = (query) => {
+  return request({
+    url: '/portal/jlDept/getList',
+    method: 'get',
+    params: query
+  })
+}

+ 349 - 0
ruoyi-web/src/components/CareHomeSel/index.vue

@@ -0,0 +1,349 @@
+<template>
+  <el-button text @click="dialogVisible = true"
+  >{{title}}</el-button
+  >
+  <el-dialog
+      v-model="dialogVisible"
+      title="养老机构选择"
+      width="80%"
+      :before-close="handleClose"
+  >
+    <div class="echarts-box">
+      <div class="ssqh">
+        <p class="sxzd">行政区划</p>
+
+      <el-scrollbar wrapClass="scroll-wrap">
+      <el-tree
+          node-key="code"
+          :props="defaultProps"
+          :default-expanded-keys="expands"
+          :expand-on-click-node="false"
+          lazy
+          :load="loadNode"
+          ref="tree"
+          :check-strictly="true"
+          show-checkbox
+          highlight-current
+          @check="checkGroupNode"
+      />
+    </el-scrollbar>
+      </div>
+      <div class="jgxz">
+        <el-from :model="formLabelAlign" ref="queryRef">
+          <div class="flex">
+            <el-form-item label="机构名称" prop="jgmc">
+              <el-input v-model="formLabelAlign.jgmc" clearable placeholder="请输入机构名称" />
+            </el-form-item>
+            <el-form-item label="机构类型" prop="status">
+              <el-select v-model="formLabelAlign.status" clearable placeholder="请选择机构类型">
+                <el-option v-for="item in DictS.XZ093" :label="item.label" :value="item.value" />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="有无空余床位" prop="cwzs">
+              <el-select v-model="formLabelAlign.cwzs" clearable placeholder="请选择有无空余床位">
+                <el-option v-for="item in DictS.CZ035" :key="item.value" :label="item.label" :value="item.value" />
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-button type="danger" @click="handleQuery">搜索</el-button>
+              <el-button @click="resetQuery()">重置</el-button>
+            </el-form-item>
+          </div>
+
+        </el-from>
+
+        <el-table stripe :row-height="20" :data="jgList.slice((currentPage-1)*pagesize,currentPage*pagesize)"  @selection-change="handleSelectionChange"   >
+          <el-table-column v-if="seltype === 'select'" :key="indexMethod" label="选择" width="100px" height="50px" type="selection" align="center"/>
+          <el-table-column label="序号" :width="'90px'" height="50px" type="index" :index="indexMethod" align="center"/>
+          <el-table-column label="机构名称" align="center" prop="jgmc"/>
+          <!--el-table-column label="建立日期" align="center" prop="jlrq"/>
+          <el-table-column label="床位数" align="center" prop="cwzs"/-->
+          <el-table-column label="通信地址" align="center" prop="txdz"/>
+          <el-table-column label="联系方式" align="center" prop="frlxfs"/>
+          <el-table-column label="操作" align="center" width="300" class-name="small-padding fixed-width" fixed="right">
+            <template #default="scope">
+              <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-edit"
+                  @click="handlesel(scope.row)"
+                  >
+               确定
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination
+            v-show="totalcount > 0"
+            :total="totalcount"
+            v-model:page="formLabelAlign.pageNum"
+            v-model:limit="formLabelAlign.pageSize"
+            @pagination="handleQuery"
+        />
+      </div>
+    </div>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button type="primary" @click="dialogVisible = false"
+        >关闭</el-button
+        >
+      </span>
+    </template>
+  </el-dialog>
+</template>
+<script>
+import {defineComponent,getCurrentInstance,reactive} from "vue";
+import { ElMessageBox } from 'element-plus'
+import {gettreedata,jcxxList} from "@/api/home";
+import {mapState} from 'vuex';
+let MyDict= {};
+export default {
+  setup() {
+    const { proxy } = getCurrentInstance();
+    MyDict = proxy.useDict("XZ093", "CZ035", "CZ015");
+  },
+  created() {
+  },
+  mounted(){
+    this.DictS=MyDict;
+  },
+  props:{
+        title:{
+          type:String,
+          default:"qubau",
+        },
+        isJl:{
+          type:Boolean,
+          default:true,
+        },
+        isLoad:{
+          type:Boolean,
+          default:true,
+        },
+
+      },
+      data(){
+        return{
+          dialogVisible:false,
+          defaultProps: {
+            childre: 'children',
+            label: 'label',
+            isLeaf: 'leaf',
+          },
+          formLabelAlign: {
+            pageNum: 1,
+            pageSize: 10,
+            jgmc: "",
+            szxzqh: "",
+            status: "",
+            isChxddjg: "",
+            pddj: "",
+            cwzs: ""
+          },
+          expands:['220000000000'],
+          treenode:[],
+          resolve:{},
+          DictS:{},
+          totalcount:0,
+          pagesize:10,
+          currentPage:1,
+          headerlist: ["a","b","c"],
+          fieldwidths:["100","100","100"],
+          jgList:[],
+          seltype: 'index',
+          single: false,
+          multiple: false,
+
+        }
+      },
+      computed: {
+        ...mapState(['user']),
+      },
+
+      methods:{
+        handlesel(row)
+        {
+          this.$emit('handleNodeClick',row);
+          this.dialogVisible = false;
+        },
+        indexMethod(index)
+        {
+          let curpage=this.currentPage;
+          let limitpage=this.pagesize;
+          return index+1+(curpage-1)*limitpage;
+        },
+        rowClass({row,rowIndex})
+        {
+          return 'background:#c0cefa';
+        },
+        cellClass({row,column,rowIndex,columnIndex})
+        {
+          return 'border-left-color: #40c9c6;border-left-width:20px;';
+        },
+        current_change:function(currentPage){
+          this.currentPage = currentPage;
+        },
+        handleSelectionChange(selection) {
+          this.ids = selection.map(item => item[0].idx);
+          this.items = selection.map((item, index) => {
+            return {...item, index: this.jgList.map(ite => ite[0].idx).indexOf(item[0].idx)}
+          });
+          this.single = selection.length !== 1
+          this.multiple = !selection.length
+        },
+        handleOnclick(idx){
+          const ids = idx;
+          var ret={};
+          for(var j=0;j<this.fields.length;j++) {
+            ret[this.fields[j]]=this.oldtrainingList[ids][j];
+          }
+          this.success(ret);
+          this.close();
+        },
+        updatetree()
+        {
+          if (this.treenode) {
+            this.treenode.childNodes = [] // 清空子节点
+            this.loadNode(this.treenode, this.resolve) // 再次执行 load 的方法
+          }
+        },
+        treeClear(){
+          console.log('重置了');
+          this.$refs.tree.setCheckedKeys([]);
+        },
+        check (data, checked, indeterminate) {
+          this.$refs.tree.setCheckedKeys([data.code])
+        },
+        handleNodeClick(data,node,root) {
+          let retdata=[];
+          retdata.push(node.data);
+          let pp=node.parent;
+          while (pp)
+          {
+            retdata.push(pp.data);
+            pp=pp.parent;
+          }
+          this.$emit('handleNodeClick',retdata);
+          //this.dialogVisible = false;
+        },
+        checkGroupNode(a, b){
+          if (b.checkedKeys.length > 0) {
+            this.$refs.tree.setCheckedKeys([a.code]);
+            this.formLabelAlign.szxzqh=a.code;
+           // this.$emit('handleNodeClick',a)
+          }else {
+            this.formLabelAlign.szxzqh="";
+            //this.$emit('handleNodeClick',{code:null})
+          }
+         this.handleQuery();
+        },
+        async getdata(level, cs2, cs3, resolve) {
+
+          var para = {};
+          para.dictType = "xzqh";
+          para.outType = '0';
+          para.para1 = level;
+          para.para2 = cs2;
+          para.para3 = cs3;
+          let data = await gettreedata(para);
+          var treedata = [];
+          if (data.code == 200) {
+            for (let i = 0; i < data.data[0].recordCount; i++) {
+              treedata[i] = {};
+              for (let j = 0; j < data.data[0].columnLabelList.length; j++) {
+                treedata[i][data.data[0].columnLabelList[j].toLowerCase()] = data.data[0].rowList[i][j];
+              }
+            }
+            ;
+            treedata.forEach((item) => {
+              item.isleaf == '0' ? (item.leaf = false) : (item.leaf = true)
+            })
+            resolve(treedata);
+
+          }
+        },
+        async loadNode(node, resolve) {
+
+          if (node.level === 0) {
+            this.treenode=node;
+            this.resolve=resolve;
+            // if (this.isLoad==false) return ;
+            return this.getdata(node.level, 'sj', '', resolve);
+          } else if (node.level >= 1) {
+            //  if (this.isLoad==false) return ;
+            return this.getdata(node.level, node.data.nextlevel, node.data.id, resolve);
+          }
+        },
+        // handleNodeClick(data) {
+        //   this.$emit('handleNodeClick',data)
+        // },
+         handleQuery() {
+           this.getList();
+        },
+        resetQuery() {
+          this.formLabelAlign.jgmc = '';
+          this.formLabelAlign.szxzqh = '';
+          this.formLabelAlign.status = '';
+          this.getList();
+         }
+         ,
+        getList(querd) {
+
+          let quer = {}
+          if (querd) {
+            quer = querd
+          } else {
+         quer = {
+          ...this.formLabelAlign,
+           szxzqh: this.formLabelAlign.szxzqh
+          }
+        }
+          jcxxList(quer).then(response => {
+            this.jgList = response.rows;
+            this.totalcount=response.total;
+          });
+          },
+      },
+      watch: {
+        isLoad(newVal) {
+          this.updatetree();
+        },
+      }
+      ,
+
+    }
+
+</script>
+
+<style scoped>
+.flex {
+  display: flex;
+  margin-top: 24px;
+}
+.fy{
+  text-align:center;
+  margin-top:10px;
+}
+.echarts-box {
+  width: 100%;
+  display: flex;
+  justify-content: space-between;
+}
+.ssqh {
+  width: 20%;
+}
+.jgxz {
+  width: 80%;
+}
+.sxzd {
+  font-weight: 600;
+  margin: 10px 15px;
+}
+.dialog-footer button:first-child {
+  margin-right: 10px;
+}
+::v-deep .scroll-wrap{
+  height: 62vh;
+  padding-right: 10px;
+}
+</style>

+ 110 - 0
ruoyi-web/src/components/Number/index.vue

@@ -0,0 +1,110 @@
+<template>
+  <div class="number">
+    <el-input v-model="valueNumber" :disabled="disabled" :placeholder="'请输入'+placeholder" @input="handleChange(valueNumber)" clearable/>
+  </div>
+</template>
+<script>
+  export default {
+    name: "Number",
+    model: {
+      prop: 'value',
+      event: 'changeValue'
+    },
+    props: {
+      //绑定值
+      value: {
+        type: [Number,String],
+        default: "",
+      },
+      // 占位文本
+      placeholder:{
+        type: String,
+        default: "",
+      },
+      //最小值
+      min:{
+        type:Number,
+        require:false
+      },
+      //最大值
+      max:{
+        type:Number,
+        require:false
+      },
+      //保留的小数位数
+      precision:{
+        type:Number,
+        default: 0,
+      },
+      //是否禁用
+      disabled:{
+        type:Boolean,
+        default: false,
+      }
+    },
+    data() {
+      return {
+        valueNumber:this.value,
+      }
+    },
+    computed:{
+    },
+    watch: {
+      value: {
+         handler(newName, oldName) {
+           this.valueNumber=newName;
+        },
+        // 代表在wacth里声明了firstName这个方法之后立即先去执行handler方法
+        immediate: true,
+        deep:true,
+      }
+    },
+    methods: {
+      handleChange(value){
+        // 保留整数清除非数字的字符
+        if(this.precision>0){
+          // 根据位数动态的保留小数位数
+          this.valueNumber = this.valueNumber.replace(/[^\d.]/g,"") //清除非 数字和小数点的字符
+          let dd="";
+          for (let i = 0; i < this.precision; i++) {
+            dd+='\\d'
+          }
+          let evald=eval('/^(\\-)*(\\d+)\\.('+dd+').*$/')
+          this.valueNumber = this.valueNumber.replace(evald,'$1$2.$3'); //保留小数
+        }else {
+          this.valueNumber = this.valueNumber.replace(/[^\d]/g,"") //清除非数字的字符
+        }
+        this.valueNumber = this.valueNumber.replace(/\.{2,}/g,".") //清除第二个小数点
+        this.valueNumber = this.valueNumber.replace(/^\./g,""); //验证第一个字符是数字而不是字符
+        this.valueNumber = this.valueNumber.replace(".","$#$").replace(/\./g,"").replace("$#$",".");
+
+        if(this.max)//根据最大值判断可输入的最大长度
+        {
+          let lenght=parseInt(this.max).toString().length;
+          this.valueNumber = this.valueNumber.indexOf(".") > 0? this.valueNumber.split(".")[0].substring(0, lenght) + "." + this.valueNumber.split(".")[1]: this.valueNumber.substring(0, lenght); //限制只能输入6位正整数
+        }
+
+        if(this.min&&this.valueNumber<this.min)
+        {
+          this.valueNumber=this.min;
+          this.$modal.msgWarning(this.placeholder+"不能小于"+this.min);
+        }
+        if(this.max&&this.valueNumber>this.max)
+        {
+          this.valueNumber=this.max;
+          this.$modal.msgWarning(this.placeholder+"不能超过"+this.max);
+        }
+        this.$emit('changeValue', this.valueNumber);
+      }
+    },
+    created() {
+
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+.number{
+  width: 100%;
+}
+</style>

+ 1 - 1
ruoyi-web/src/components/OrgTreeSel/index.vue

@@ -62,7 +62,7 @@ export default defineComponent({
             label: 'label',
             isLeaf: 'leaf',
           },
-          expands:[],
+          expands:['220000000000'],
           treenode:[],
           resolve:{},
 

+ 1 - 1
ruoyi-web/src/components/OrgTreeSelEmbed/index.vue

@@ -40,7 +40,7 @@ export default defineComponent({
           label: 'label',
           isLeaf: 'leaf',
         },
-        expands:[],
+        expands:['220000000000'],
         treenode:[],
         resolve:{},
 

+ 168 - 0
ruoyi-web/src/components/RegionCascaderSelect/index.vue

@@ -0,0 +1,168 @@
+<template>
+  <!--  v-if 解决数据回显问题-->
+  <el-cascader v-if="show" :disabled="disabled" ref="cascader" v-model="cascaderValue" :props="props" v-bind="options"
+    @change="handleChange"></el-cascader>
+</template>
+<script>
+
+import { countryDeptList } from "@/api/home";
+
+export default {
+  name: 'regionCascaderSelect',
+  model: {
+    prop: 'value',
+    event: 'changeValue'
+  },
+  props: {
+    //回显数据
+    value: {
+      type: [Array, String, Object],
+      default: () => []
+    },
+    valueProp: {
+      type: String,
+      default: 'code'
+    },
+    disabled: {
+      type: Boolean,
+      default: false,
+    },
+    //是否严格的遵守父子节点不互相关联  true:可以选择任意一级。flase:选择最后一级
+    checkStrictly: {
+      type: Boolean,
+      default: true,
+    },
+    opts: {
+      type: Object,
+      default: () => ({})
+    },
+    //选中节点的数据
+    checked: {
+      type: Object,
+      default: null
+    },
+    // 是否仅展示吉林省数据
+    isJl: {
+      type: Boolean,
+      default: true
+    },
+    endLevel: {
+      type: [Number, String],
+      default: 4
+    },
+    startLevel: {
+      type: [Number, String],
+      default: 0
+    },
+  },
+  watch: {
+    checkStrictly(newVal) {
+      this.props.checkStrictly = newVal;
+    },
+    value: {
+      handler(newVal, oldVal) {
+        if (this.isCascaderValueChange) {
+          this.isCascaderValueChange = false;
+          return;
+        }
+        // console.log('newVal --> ', newVal);
+        this.setCascaderValue(newVal);
+      },
+      immediate: true,  //刷新加载 立马触发一次handler
+      deep: true
+    }
+  },
+  mounted() {
+    let defaultOpts = {
+      placeholder: '请选择所属区划',
+      'popper-class': 'cascader-popper region-cascader',
+      clearable: true
+    };
+    this.options = {
+      ...defaultOpts,
+      ...this.opts
+    };
+    this.props.checkStrictly = this.checkStrictly;
+  },
+  data() {
+    return {
+      options: {},
+      show: true, //为了解决数据回显问题引入
+      cascaderValue: [],//级联组件的值
+      isCascaderValueChange: false,//是否为级联组件主动触发的change事件
+    }
+  },
+  computed: {
+    props() {
+      return {
+        lazy: true,
+        checkStrictly: true,
+        lazyLoad: async (node, resolve) => {
+          const { level } = node;
+          let levelData = 0;
+          let params = '';
+          if (level === 0) {
+            this.isJl ? params = '' : params = { parentId: "479a446fce894740b373f9c4b356daac" }
+          } else {
+            params = { parentId: node.data.nodeData.id };
+          }
+          // let params = level === 0 ? '' : {parentId: node.data.nodeData.id};
+          let response = await countryDeptList(params);
+          let code = response.code;
+          let data = response.data || response.rows;
+          if (code !== 200) {
+            this.$message.error('获取行政区划数据失败!');
+            resolve([]);
+            return;
+          }
+          let res = data.map(item => {
+            let value = String(item[this.valueProp]);
+            let disabled = level < this.startLevel;
+            let endLevel = this.endLevel;
+            return {
+              disabled,
+              label: item.name,
+              value,
+              leaf: level >= endLevel,
+              nodeData: item
+            }
+          });
+          resolve(res);
+        },
+      }
+    }
+  },
+  created() {
+  },
+  methods: {
+    handleChange(value) {
+      this.isCascaderValueChange = true;
+      this.$emit('changeValue', value);
+      //将被选中的节点的信息传递出去 👇
+      let checkedNode = this.$refs.cascader.getCheckedNodes();
+      checkedNode = checkedNode.length > 0 ? checkedNode[0]['data']['nodeData'] : null;
+      this.$emit('update:checked', checkedNode);
+      //将被选中的节点的全部信息传递出去 👇
+      this.$emit('nodeData', this.$refs.cascader.getCheckedNodes());
+    },
+    setCascaderValue(newVal) {
+      this.show = false;
+      let values = newVal || [];
+      if (typeof values === 'string') {
+        //如果赋值是 json 格式
+        values = JSON.parse(values);
+      }
+      this.cascaderValue = [...values];
+      this.$nextTick(() => {
+        this.show = true;
+      });
+    },
+    getCheckedNodes() {
+      return this.$refs.cascader.getCheckedNodes();
+    },
+  }
+}
+</script>
+<style lang="scss">
+
+</style>

+ 8 - 0
ruoyi-web/src/main.js

@@ -19,9 +19,14 @@ import FileUpload from "@/components/FileUpload"
 import ImageUpload from "@/components/ImageUpload"
 // 图片预览组件
 import ImagePreview from "@/components/ImagePreview"
+//数字组件
+import Number from '@/components/Number'
+// 五级级联组件
+import RegionCascaderSelect from '@/components/RegionCascaderSelect'
 import Org_tree from '@/components/Org_tree'
 import OrgTreeSel from "@/components/OrgTreeSel"
 import OrgTreeSelEmbed from "@/components/OrgTreeSelEmbed"
+import CareHomeSel from "@/components/CareHomeSel"
 import * as ElIcon from '@element-plus/icons-vue'
 
 const app = createApp(App)
@@ -40,7 +45,10 @@ app.component('ImageUpload', ImageUpload)
 app.component('ImagePreview', ImagePreview)
 app.component('OrgTreeSel', OrgTreeSel)
 app.component('OrgTreeSelEmbed', OrgTreeSelEmbed)
+app.component('CareHomeSel', CareHomeSel)
 app.component('Pagination', Pagination)
+app.component('Number', Number)
+app.component('RegionCascaderSelect', RegionCascaderSelect)
 app.use(Org_tree)
 app.use(store)
 app.use(plugins)

+ 100 - 0
ruoyi-web/src/utils/regular.js

@@ -0,0 +1,100 @@
+export const Regular = {
+  // 社会信用代码
+  'CreditCode': /[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}/,
+  //法定代表人或负责人姓名
+  // * 1.可以是中文
+  //  2.可以是英文,允许输入点(英文名字中的那种点), 允许输入空格
+  // 3.中文和英文不能同时出现
+  'Name': /^([\u4e00-\u9fa5]{1,100}|[a-zA-Z.\s]{1,100})$/,
+  //电话号
+  'Phone': /^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/,
+  //身份证号
+  'ID':/^\d{15}(\d{2}[A-Za-z0-9])?$/,
+  //手机号
+  'Mobile': /^((0\d{2,3}-?\d{7,8})|(^1[0-9]{10}$))$/,
+};
+export const validateSum  = (rule, value, callback) => {
+  if (value>0) {
+    callback();
+  } else {
+    callback(new Error('不能小于零'));
+  }
+}
+export const validateMoney = (rule, value, callback) => {
+  if (value>100) {
+    callback(new Error('输入不能大于100'));
+  } else if(value<=0){
+    callback(new Error('不能小于零'));
+  }else {
+    callback();
+  }
+}
+export const chineseOne  = (rule, value, callback) => {
+  let reg=/^.*[\u4e00-\u9fa5].*$/;
+  if (reg.test(value)) {
+    callback();
+  } else {
+    callback(new Error('至少包含一个汉字'));
+  }
+}
+export const idCard  = (rule, value, callback) => {
+  if (isSFZH(value)) {
+    callback();
+  } else {
+    callback(new Error('证件号码格式不正确'));
+  }
+}
+function isSFZH(id) {
+  if (id == null || id == "") {
+    return true;
+  }
+
+  if (id.length == 15) {
+    if (isNaN(id)) {
+      return false;
+    }
+    if (id.substring(8, 10) > 12 || id.substring(10, 12) > 31) {
+      return false;
+    }
+  }
+  else if (id.length == 18) {
+    if (isNaN(id.substring(0, 17)) || (isNaN(id.substring(17, 18)) && id.substring(17, 18).toLowerCase() != "x")) {
+      return false;
+    }
+
+    if (id.substring(10, 12) > 12 || id.substring(12, 14) > 31) {
+      return false;
+    }
+    //校验最后一位校验位
+    if (!CheckTheEighteenth(id)) {
+      return false;
+    }
+  }
+  else {
+    return false;
+  }
+  return true;
+}
+function CheckTheEighteenth(SFZH) {
+  var CheckCode; //保存最后一位
+  var OtherCode;  //保存其余位
+  var Sum = 0;          //保存计数和
+  var TempCode;
+  var S = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
+  var N = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1);
+
+  OtherCode = SFZH.substring(0, 17);
+
+  CheckCode = SFZH.substring(17, 18);
+
+  for (var i = 0; i < 17; i++) {
+    TempCode = OtherCode.substring(i, i + 1);
+
+    Sum += parseInt(TempCode) * N[i];
+  }
+  if (S[Sum % 11] == CheckCode) {
+    return true;
+  } else {
+    return false;
+  }
+}

+ 1 - 4
ruoyi-web/src/views/rzyljgsq/index.vue

@@ -132,10 +132,7 @@ const search = () => showSearch.value = true
 
 // 查询结果表单相关
 const formRef = ref()
-const form = reactive({
-  // xm: '夏洛',
-  // zjhm: '220123194808291226',
-})
+const form = reactive({})
 const rules = reactive({
   xm: [
     { required: true, message: '请输入老人姓名', trigger: 'blur' },

+ 199 - 27
ruoyi-web/src/views/rzyljgsq/sqzltx/index.vue

@@ -23,15 +23,16 @@
         <el-form-item label="联系方式" prop="yyLrRzyddh">
           <el-input v-model="form.yyLrRzyddh" placeholder="请输入手机号码" clearable></el-input>
         </el-form-item>
-        <el-form-item label="养老机构选择" prop="yyLrYljg">
-          <el-input class="yljg-ipt" v-model="form.yyLrYljg" placeholder="请选择养老机构" disabled clearable></el-input>
-          <el-button type="danger" @click="showOrg = true">选 择</el-button>
+        <el-form-item label="养老机构选择" prop="jgmc">
+          <el-input class="yljg-ipt" v-model="form.jgmc" placeholder="请选择养老机构" disabled></el-input>
+          <el-button type="danger" @click="chooseBtn">选 择</el-button>
         </el-form-item>
         <el-form-item label="老人居住地址所在行政区划" prop="lrjzdzxzqh">
-          <el-input v-model="form.lrjzdzxzqh" placeholder="请选择老人居住地址所在行政区划" clearable></el-input>
+          <RegionCascaderSelect v-model="form.lrjzdzxzqh" :checkStrictly="false"></RegionCascaderSelect>
         </el-form-item>
-        <el-form-item label="居住地址描述" prop="lrjzdz">
-          <el-input v-model="form.lrjzdz" placeholder="请输入老人居住地址" clearable></el-input>
+        <el-form-item label="详细地址" prop="lrjzdz">
+          <el-input v-model="form.lrjzdz" type="textarea" maxlength="400" show-word-limit placeholder="请输入老人详细居住地址">
+          </el-input>
         </el-form-item>
         <el-form-item>
           <el-button v-loading="loading" element-loading-background="rgba(255, 255, 255, 0.3)" class="submitBtn"
@@ -42,8 +43,59 @@
     </div>
   </div>
   <!-- 选择养老机构弹出框 -->
-  <el-dialog title="养老机构选择" width="900px" v-model="showOrg" append-to-body>
-
+  <el-dialog custom-class="org-dialog" title="养老机构选择" width="900px" v-model="showOrg" align-center append-to-body
+    top="8vh">
+    <el-scrollbar>
+      <el-row justify="space-between">
+        <el-col :span="7">
+          <OrgTreeSelEmbed ref="dztree" @handleNodeClick="getOrgList($event)"></OrgTreeSelEmbed>
+        </el-col>
+        <el-col :span="16">
+          <div class="bottom_box" v-loading="loading" v-if="orgList.length>0">
+            <div class="jg_box" v-for="(item,index) in orgList" :key="index">
+              <div class="jg_main" @click="chooseOrg(item)" :class="{active: item.id === active }">
+                <div class="img">
+                  <el-image style="width: 100%;height: 100%" :src="item.url" fit="cover">
+                    <template #error>
+                      <div class="image-slot">
+                        <el-icon>
+                          <icon-picture />
+                        </el-icon>
+                      </div>
+                    </template>
+                  </el-image>
+                </div>
+                <div class="rigth_nr">
+                  <div class="height25 font_style1">
+                    {{item.jgmc}}
+                  </div>
+                  <div class="height25 font_style2">
+                    <el-rate v-model="item.dj" disabled text-color="#ff9900" />
+                    ({{selectDictLabel(CZ015,item.pddj)}})
+                  </div>
+                  <div class="height25 font_style3">
+                    地址:{{item.txdz}}
+                  </div>
+                  <div class="height25 font_style3">
+                    电话:{{item.frlxfs}}
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+          <div v-else>
+            <el-empty :image-size="200" />
+          </div>
+          <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
+            v-model:limit="queryParams.pageSize" @pagination="getList" />
+        </el-col>
+      </el-row>
+    </el-scrollbar>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button type="danger" @click="showOrg = false">确 定</el-button>
+      </span>
+    </template>
   </el-dialog>
 </template>
   
@@ -51,50 +103,57 @@
 <script setup>
 import { onBeforeUnmount, reactive, ref } from 'vue'
 import { useRouter } from 'vue-router'
-import { orderOrg } from '@/api/home'
+import { orderOrg, jcxxList } from '@/api/home'
+import { Regular, chineseOne, idCard } from '@/utils/regular'
 
-const showForm = ref(true)
+let timer
+  , router = useRouter()
+const { proxy } = getCurrentInstance();
+const { CZ015 } = proxy.useDict('CZ015');
 const showOrg = ref(false)
+
+/*------------表单相关start--------------*/
 const loading = ref(false)
 const formRef = ref()
-let router = useRouter()
-let timer
-
-// 表单数据
-const form = reactive({
-  // xm: '夏洛', // 姓名
-  // zjhm: '220123194808291226', // 证件号码
-  // lrjzdzxzqh: '220102001001', // 居住地行政区划
-  // lrjzdz: '前进大街1000号', // 居住地址
-  // yyLrRzyddh: '15578176756',  // 联系方式
-  // yyLrYljg: '03bc8c3afc1c233a6fd07483193a0014',  // 选择机构
-})
-// 表单校验规则
+const showForm = ref(true)
+const form = reactive({})
 const rules = reactive({
   xm: [
     { required: true, message: '请输入老人姓名', trigger: 'blur' },
+    { validator: chineseOne, trigger: 'blur' }
   ],
   zjhm: [
     { required: true, message: '请输入老人身份证号码', trigger: 'blur' },
-    { max: 18, message: '身份证号码不能超过18位', trigger: 'blur' },
+    { validator: idCard, trigger: 'blur' }
   ],
   lrjzdzxzqh: [
     { required: true, message: '请输入老人居住地址', trigger: 'blur' },
   ],
   yyLrRzyddh: [
     { required: true, message: '请输入填报人手机号码', trigger: 'blur' },
+    { pattern: Regular.Mobile, message: '手机号格式不对', trigger: 'blur' }
   ],
-  yyLrYljg: [
+  jgmc: [
     { required: true, message: '请选择机构', trigger: 'blur' },
   ],
 })
-
 async function onSubmit(formEl) {
   if (!formEl) return
   await formEl.validate((valid, fields) => {
     loading.value = true
     if (valid) {
-      orderOrg(form).then((res) => {
+      let szxzqh = ''
+      if (Array.isArray(form.lrjzdzxzqh)) {
+        szxzqh = form.lrjzdzxzqh[form.lrjzdzxzqh.length - 1]
+      } else {
+        let data = JSON.parse(form.lrjzdzxzqh)
+        szxzqh = data[data.length - 1]
+      }
+      let postData = {
+        ...form,
+        lrjzdzxzqh: szxzqh
+      }
+      orderOrg(postData).then((res) => {
         console.log(res);
         showForm.value = false
         timer = setTimeout(() => router.push('/rzyljgsq'), 2000)
@@ -102,10 +161,53 @@ async function onSubmit(formEl) {
         loading.value = false
       })
     } else {
+      console.log(fields);
       loading.value = false
     }
   })
 }
+/*------------表单相关end-------------*/
+
+/*------------养老机构选择start--------------*/
+const active = ref('')
+const orgList = ref([])
+const total = ref(0)
+const queryParams = reactive({
+  pageNum: 1,
+  pageSize: 5,
+  isChxddjg: '',
+  pddj: '',
+  cwzs: '',
+  jgmc: '',
+  status: '',
+  szxzqh: '',
+})
+function chooseOrg(rows) {
+  active.value = rows.id
+  form.jgmc = rows.jgmc
+  form.yyLrYljg = rows.id
+}
+function chooseBtn(e) {
+  showOrg.value = true
+  orgList.value.length > 0 ? false : getOrgList(e)
+}
+function getOrgList(e) {
+  queryParams.szxzqh = e.code
+  getList()
+}
+function getList() {
+  loading.value = true;
+  jcxxList(queryParams).then(response => {
+    orgList.value = response.rows.map(item => {
+      return { ...item, dj: parseInt(item.pddj), url: item.jgUrl ? item.jgUrl.split(',')[0] : '' }
+    });
+    console.log('orgList', orgList.value);
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+/*------------养老机构选择end--------------*/
 
 onBeforeUnmount(() => {
   clearTimeout(timer)
@@ -189,4 +291,74 @@ onBeforeUnmount(() => {
     }
   }
 }
+
+.bottom_box {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: space-between;
+
+  .jg_box {
+    width: 100%;
+    height: 100px;
+    background: #FAFAFC;
+    display: flex;
+    margin-bottom: 20px;
+    padding: 1px;
+  }
+
+  .jg_main {
+    width: 100%;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: 3px;
+    cursor: pointer;
+
+    &.active {
+      box-shadow: 0 0 0 1px #bfd4f5;
+    }
+
+    .img {
+      width: 25%;
+      height: 100%;
+      background: #bfd4f5;
+    }
+
+    .rigth_nr {
+      display: flex;
+      flex-direction: column;
+      height: 100%;
+      width: 70%;
+    }
+  }
+
+  .height25 {
+    height: 25%;
+    display: flex;
+    align-items: center;
+
+  }
+
+  .font_style1 {
+    font-size: 16px;
+    font-weight: bold;
+    color: #444B55;
+  }
+
+  .font_style2 {
+    font-size: 14px;
+    font-weight: 400;
+    color: #444B55;
+  }
+
+  .font_style3 {
+    font-size: 14px;
+    font-weight: 400;
+    color: #999999;
+  }
+}
+
+.pagination-container {
+  padding: 0;
+}
 </style>

+ 1 - 4
ruoyi-web/src/views/slhgzsq/index.vue

@@ -92,10 +92,7 @@ const search = () => showSearch.value = true
 
 // 查询结果表单相关
 const formRef = ref()
-const form = reactive({
-  tbrXm: '',
-  tbrSjhm: ''
-})
+const form = reactive({})
 const rules = reactive({
   tbrXm: [
     { required: true, message: '请输入申请人姓名', trigger: 'blur' },

+ 12 - 55
ruoyi-web/src/views/slhgzsq/sqzltx/index.vue

@@ -15,23 +15,19 @@
       <el-form v-if="showForm" ref="formRef" class="applyForm" :model="form" :rules="rules" label-width="191px"
         size="large" :inline="true">
         <el-form-item label="改造对象姓名" prop="xm">
-          <el-input v-model="form.xm" placeholder="请输入改造对象姓名" clearable />
+          <el-input v-model="form.xm" placeholder="请输入改造对象姓名" />
         </el-form-item>
         <el-form-item label="改造对象联系电话" prop="lxdh">
-          <el-input v-model="form.lxdh" placeholder="请输入改造对象联系电话" clearable />
+          <el-input v-model="form.lxdh" placeholder="请输入改造对象联系电话" />
         </el-form-item>
         <el-form-item label="改造资金" prop="gzzj">
-          <el-input v-model="form.gzzj" type="number" placeholder="请输入改造资金" clearable></el-input>
-          <!-- <number placeholder="请输入改造资金" v-model="form.gzzj" :min="0" :max="10000000000" :precision="2" /> -->
+          <number placeholder="请输入改造资金" v-model="form.gzzj" :min="0" :max="10000000000" :precision="2" />
         </el-form-item>
         <el-form-item label="其中财政补助资金" prop="czbtzjQt">
-          <el-input v-model="form.czbtzjQt" type="number" placeholder="请输入财政补助资金" clearable></el-input>
-          <!-- <number placeholder="其中财政补助资金" v-model="form.czbtzjQt" :min="0" :max="10000000000" :precision="2" /> -->
+          <number placeholder="其中财政补助资金" v-model="form.czbtzjQt" :min="0" :max="10000000000" :precision="2" />
         </el-form-item>
         <el-form-item label="改造住房地址" prop="zfdz">
-          <!-- <el-input v-model="form.zfdz" placeholder="请输入改造住房地址" clearable></el-input> -->
-          <el-cascader v-model="form.zfdz" :props="props" placeholder="请输入改造住房地址" clearable></el-cascader>
-          <!-- <RegionCascaderSelect v-model="form.zfdz" style="width: 100%"></RegionCascaderSelect> -->
+          <RegionCascaderSelect v-model="form.zfdz" :checkStrictly="false"></RegionCascaderSelect>
         </el-form-item>
         <el-form-item label="详细地址" prop="xxdz">
           <el-input v-model="form.xxdz" type="textarea" maxlength="400" show-word-limit placeholder="请输入详细地址" />
@@ -85,7 +81,8 @@
 <script setup>
 import { getCurrentInstance, reactive, ref } from 'vue'
 import { useRouter } from 'vue-router'
-import { retrofitApply, CountryDeptList } from '@/api/home'
+import { retrofitApply } from '@/api/home'
+import { Regular, chineseOne, idCard } from '@/utils/regular'
 
 let router = useRouter()
 let timer
@@ -96,26 +93,15 @@ const { CZ035, CH048, CH049 } = proxy.useDict('CZ035', 'CH048', 'CH049')
 const loading = ref(false)
 const formRef = ref()
 const showForm = ref(true)
-const form = reactive({
-  xm: '夏洛',
-  lxdh: '15512341234',
-  isTsknlr: '1',
-  gzzj: '10000',
-  czbtzjQt: '5000',
-  zfdz: '',
-  xxdz: '详细地址',
-  // sfdm:'01',
-  // gznr:'03',
-  tbrXm: '填报人',
-  tbrSjhm: '15512341234',
-})
+const form = reactive({})
 const rules = reactive({
   xm: [
     { required: true, message: '改造对象姓名不能为空', trigger: 'blur' },
-    { max: 72, message: '改造对象姓名不能超过72个字符', trigger: 'blur' },
+    { validator: chineseOne, trigger: 'blur' }
   ],
   lxdh: [
     { required: true, message: '改造对象联系电话不能为空', trigger: 'blur' },
+    { pattern: Regular.Mobile, message: '手机号格式不对', trigger: 'blur' }
   ],
   isTsknlr: [
     { required: true, message: '是否特殊困难老年人不能为空', trigger: 'blur' }
@@ -148,10 +134,11 @@ const rules = reactive({
   ],
   tbrXm: [
     { required: true, message: '填报人姓名不能为空', trigger: 'blur' },
-    { max: 72, message: '填报人姓名不能超过72个字符', trigger: 'blur' },
+    { validator: chineseOne, trigger: 'blur' }
   ],
   tbrSjhm: [
     { required: true, message: '填报人手机号码不能为空', trigger: 'blur' },
+    { pattern: Regular.Mobile, message: '手机号格式不对', trigger: 'blur' }
   ]
 })
 
@@ -183,7 +170,6 @@ async function onSubmit(formEl) {
         gznr: form.gznr.join(','),
         zfdz: szxzqh
       }
-      console.log('postData', postData);
       retrofitApply(postData).then((res) => {
         console.log('res', res);
         showForm.value = false
@@ -197,35 +183,6 @@ async function onSubmit(formEl) {
   })
 }
 /* --------表单相关end---------- */
-
-/* --------改造住房地址级联框start---------- */
-const props = {
-  lazy: true,
-  checkStrictly: true,
-  lazyLoad: async (node, resolve) => {
-    const { level } = node
-    let params = level === 0 ? "" : { parentId: node.data.nodeData.id }
-    let response = await CountryDeptList(params)
-    let code = response.code
-    let data = response.data || response.rows
-    if (code !== 200) {
-      this.$message.error("获取行政区划数据失败!")
-      resolve([])
-      return
-    }
-    let res = data.map(item => {
-      let value = String(item["code"])
-      return {
-        label: item.name,
-        value,
-        leaf: level >= 4,
-        nodeData: item
-      }
-    })
-    resolve(res)
-  }
-}
-/* --------改造住房地址级联框end---------- */
 </script>
   
 

+ 1 - 0
ruoyi-web/src/views/yldt/index.vue

@@ -145,6 +145,7 @@
 			</div>
 		</div>
 	</div>
+  <CareHomeSel ref="dztree" title="机构查询" @handleNodeClick="NodeClick($event)"></CareHomeSel>
 </template>
 
 <script setup>