浏览代码

会員一覧

quyx@nextosd.com 4 月之前
父节点
当前提交
2e1741d7d7

+ 79 - 0
src/api/fcbi/fcMember.js

@@ -0,0 +1,79 @@
+import request from '@/utils/request'
+import {encryptField} from "@/utils/encrypt.js";
+
+// 查询FC会員基本情報列表
+export function listMember(query) {
+  return request({
+    url: '/system/member/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询FC会員基本情報详细
+export function getMember(fcMemberId) {
+  return request({
+    url: '/system/member/' + fcMemberId,
+    method: 'get'
+  })
+}
+
+// 新增FC会員基本情報
+export function addMember(data) {
+  return request({
+    url: '/system/member',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改FC会員基本情報
+export function updateMember(data) {
+  return request({
+    url: '/system/member',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除FC会員基本情報
+export function delMember(fcMemberId) {
+  return request({
+    url: '/system/member/' + fcMemberId,
+    method: 'delete'
+  })
+}
+
+// ユーザーパスワードをリセット
+export function resetUserPwd(fcMemberId, passwordHashValue, version) {
+  let passwordHash = encryptField(passwordHashValue);
+  const data = {
+    fcMemberId,
+    passwordHash,
+    version
+  }
+  return request({
+    url: '/system/member/resetPwd',
+    method: 'put',
+    data: data
+  })
+}
+
+// 会員情報編集
+export function getMemberEdit(data) {
+  return request({
+    url: '/system/member/memberEdit',
+    method: 'post',
+    data: data
+  })
+}
+
+export function getMemberPosEdit(data) {
+  return request({
+    url: '/system/member/memberPosEdit',
+    method: 'post',
+    data: data
+  })
+}
+
+

+ 14 - 0
src/router/index.js

@@ -223,6 +223,20 @@ export const constantRoutes = [
             }
         ]
     },
+    {
+        path: '/fcMemberAdmin',
+        component: Layout,
+        hidden: true,
+        redirect: 'noredirect',
+        children: [
+            {
+                path: 'fcMemberEdit/:fcMemberId',
+                component: () => import('@/views/fcbi/fcMember/edit'),
+                name: 'fcMemberEdit',
+                meta: {title: '会員情報編集', icon: 'user'}
+            }
+        ]
+    },
 ]
 
 // ダイナミックルート、ユーザー権限に基づいて動的に読み込みます

+ 2 - 1
src/utils/messageInfo.js

@@ -19,5 +19,6 @@ export default {
     'E0048': '確認用のパスワードと新パスワードが一致しません。',
     'Y0001': '{0}を少なくとも1つ選択してください。',
     'Y0002': '日付範囲は完全に入力してください(年、月、日をすべて選択)。',
-    'Y0003': '開始日付は終了日付より後の日付を選択できません。'
+    'Y0003': '開始日付は終了日付より後の日付を選択できません。',
+    'F0001': '会具【{0}】の新パスフ一ドをご入カください。'
 }

+ 6 - 6
src/views/fcbi/customer/list.vue

@@ -37,7 +37,7 @@
     </el-form>
 
     <el-table v-show="initLoadingCompleted" v-loading="listLoading" :border="true" :data="CustomerList">
-      <el-table-column :show-overflow-tooltip="true" align="left" header-align="center" label="顧客" min-width="60"
+      <el-table-column :show-overflow-tooltip="true" align="left" header-align="center" label="顧客" min-width="60"
                        prop="customerName"
       >
       </el-table-column>
@@ -45,25 +45,25 @@
                        prop="customerNameKana"
       >
       </el-table-column>
-      <el-table-column :show-overflow-tooltip="true" align="left" header-align="center" label="FC" min-width="80"
+      <el-table-column :show-overflow-tooltip="true" align="left" header-align="center" label="FC" min-width="60"
                        prop="brandName"
                        width=""/>
-      <el-table-column :show-overflow-tooltip="true" align="left" header-align="center" label="店舗名" min-width="60"
+      <el-table-column :show-overflow-tooltip="true" align="left" header-align="center" label="店舗名" min-width="70"
                        prop="storeName"
                        width=""/>
-      <el-table-column :show-overflow-tooltip="true" align="left" header-align="center" label="住所" min-width="90"
+      <el-table-column :show-overflow-tooltip="true" align="left" header-align="center" label="住所" min-width="180"
                        prop="address1"
                        width=""/>
       <el-table-column :show-overflow-tooltip="true" align="center" header-align="center" label="郵便番号" min-width="70"
                        prop="postalCode"
                        width=""/>
-      <el-table-column :show-overflow-tooltip="true" align="center" header-align="center" label="お電話番号" min-width="60"
+      <el-table-column :show-overflow-tooltip="true" align="center" header-align="center" label="お電話番号" min-width="70"
                        prop="mobilePhone"
                        width=""/>
       <el-table-column :show-overflow-tooltip="true" align="center" header-align="center" label="生年月日" min-width="70"
                        prop="birthDate"
                        width=""/>
-      <el-table-column :show-overflow-tooltip="true" align="center" header-align="center" label="直近購入年月" min-width="70"
+      <el-table-column :show-overflow-tooltip="true" align="center" header-align="center" label="直近購入年月" min-width="50"
                        prop="lastPurchaseMonth"  :formatter="formatPurchaseMonth"
                        width=""/>
       <el-table-column align="center" class-name="small-padding fixed-width" label="操作" min-width="180" width="300">

+ 152 - 0
src/views/fcbi/fcMember/edit.vue

@@ -0,0 +1,152 @@
+<template>
+  <div class="app-container">
+    <el-form-item>
+      <el-button type="primary" >閉じる</el-button>
+      <el-button  type="primary" >マイページ利用</el-button>
+      <el-button  type="primary" >会員情報保存</el-button>
+    </el-form-item>
+    <el-row :gutter="20">
+      <el-col :span="12" v-for="(item, index) in formItems.slice(0, 6)" :key="index">
+        <el-form-item :label="item.label" label-width="230px" label-position="left">
+          <el-input
+              v-model="data.form[item.prop]"
+              class="small-input"
+              :disabled="item.disabled"
+          />
+        </el-form-item>
+      </el-col>
+
+      <el-col :span="12" v-for="(item, index) in formItems.slice(6)" :key="index + 6">
+        <el-form-item :label="item.label" label-width="230px" label-position="left">
+          <el-input
+              v-model="data.form[item.prop]"
+              class="small-input"
+              :disabled="item.disabled"
+          />
+        </el-form-item>
+      </el-col>
+    </el-row>
+    <div class="custom-divider">
+      <span class="divider-line"></span>
+      <span class="divider-text">POSレジ設定</span>
+      <span class="divider-line"></span>
+    </div>
+    <el-form-item>
+      <el-button type="primary" >POSレジを追加</el-button>
+    </el-form-item>
+    <el-row :gutter="20">
+      <el-col :span="12" v-for="(item, index) in formPosItems.slice(0, 6)" :key="index">
+        <el-form-item :label="item.label" label-width="230px" label-position="left">
+          <el-input v-model="data.form[item.prop]" :disabled="item.disabled" class="small-input" />
+        </el-form-item>
+      </el-col>
+
+      <el-col :span="24">
+        <el-form-item label="POS連携設定" label-width="230px" label-position="left">
+          <el-input v-model="data.form.posLinkInfo"  class="address-input" />
+        </el-form-item>
+        <el-form-item label="POS個別設定" label-width="230px" label-position="left">
+          <el-input v-model="data.form.customSettings"  class="address-input" />
+        </el-form-item>
+      </el-col>
+
+      <el-col :span="12" v-for="(item, index) in formPosItems.slice(6)" :key="index + 6">
+        <el-form-item :label="item.label" label-width="230px" label-position="left">
+          <el-input v-model="data.form[item.prop]"  class="small-input" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="24">
+        <el-form-item label="POS更新理由" label-width="230px" label-position="left">
+          <el-input v-model="data.form.posUpdateReason"  class="address-input" />
+        </el-form-item>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup>
+import { reactive} from 'vue';
+import { useRoute } from 'vue-router';
+import { getMemberEdit } from "@/api/fcbi/fcMember.js";
+
+// ルート情報の取得
+const route = useRoute();
+// ルートパラメータから顧客IDを取得
+const fcMemberId = route.params.fcMemberId;
+
+const data = reactive({
+  form: {},
+  queryParams: {},
+});
+
+// フォーム項目の定義(ラベルと対応するデータプロパティ、禁用状態)
+const formItems = [
+  { label: 'FC会員コード', prop: 'fcMemberCode', disabled: true },
+  { label: 'FC会員名', prop: 'fcMemberName' },
+  { label: '会員登録日時', prop: 'registrationDate', disabled: true },
+  { label: '申込者ID', prop: 'fcApplicantId', disabled: true },
+  { label: '連絡者', prop: 'contactPerson' },
+  { label: '連絡先電話番号', prop: 'contactPhone' },
+  { label: '会員活性状態', prop: 'activeStatusName' },
+  { label: '会員タイプ', prop: 'fcMemberTypeName' },
+  { label: 'マイページ権限', prop: 'mypageAccessAuthName', disabled: true },
+  { label: 'ログイン情報送信状態', prop: 'loginInfoSentName', disabled: true },
+  { label: '最終ログイン日時', prop: 'lastLoginDate', disabled: true },
+  { label: 'ログイン情報送信日時', prop: 'loginInfoSentTime', disabled: true },
+  { label: 'POS管理レベル', prop: 'posManagementLevelName' },
+  { label: 'デフォルトPOS ID', prop: 'defaultPosId' },
+  { label: '会員レベル', prop: 'fcMemberLevelName' },
+  { label: '外部電子契約システム会員識別子', prop: 'externalContractSystemId', disabled: true },
+];
+
+const formPosItems = [
+  { label: 'POSレジID', prop: 'posId', disabled: true },
+  { label: 'POS機種タイプ', prop: 'posTypeName' },
+  { label: 'POSモデル', prop: 'posModel'},
+  { label: 'POSシリアル番号', prop: 'posSerialNumber' },
+  { label: 'POS設置日', prop: 'posInstallDate' },
+  { label: 'POS設定最終更新日時', prop: 'lastUpdated' },
+  { label: 'POSステータス', prop: 'posStatusName' },
+  { label: 'POS活性化コード', prop: 'activationCode' },
+  { label: 'APIアクセスキー', prop: 'apiAccessKey' },
+  { label: '同期間隔(分)', prop: 'dataSyncInterval' },
+  { label: 'POS同期状態', prop: 'posSyncStatusName' },
+  { label: 'POS最終同期日時', prop: 'lastSyncTime'},
+  { label: 'POS更新必要フラグ', prop: 'posUpdateRequiredName' },
+  { label: 'POS設定バージョン', prop: 'posConfigVersion' },
+];
+
+// 顧客詳細の取得
+const fetchCustomerDetail = async () => {
+  const requestData = { fcMemberId };
+  const response = await getMemberEdit(requestData);
+  if (response.code === 200) {
+    data.form = response.data || {};
+  }
+};
+
+// ページ読み込み時に顧客詳細情報を取得
+fetchCustomerDetail();
+</script>
+
+<style>
+.small-input,
+.address-input {
+  width: 100%;
+}
+.custom-divider {
+  display: flex;
+  align-items: center;
+  margin: 5px 0;
+}
+.divider-line {
+  flex: 1;
+  height: 4px;
+  background-color: #0080c7;
+}
+.divider-text {
+  padding: 0 10px;
+  font-size: 14px;
+  color: #333;
+}
+</style>

+ 192 - 0
src/views/fcbi/fcMember/list.vue

@@ -0,0 +1,192 @@
+<!-- 会員一覧 -->
+<template>
+  <div class="app-container">
+    <el-form ref="queryRef" :inline="true" :model="queryParams">
+      <el-form-item label="会員コード" prop="fcMemberCode">
+        <el-input v-model="queryParams.fcMemberCode"
+                  clearable maxlength="128"
+                  :parser="parseAlphabetNumeric"
+                  :formatter=parseAlphabetNumeric
+                  @keyup.enter="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="会員名" prop="fcMemberName">
+        <el-input v-model="queryParams.fcMemberName"
+                  clearable
+                  maxlength="255" @keyup.enter="handleQuery"/>
+      </el-form-item>
+          <el-form-item label="連絡者" prop="contactPerson">
+            <el-input v-model="queryParams.contactPerson"
+                      clearable maxlength="50" @keyup.enter="handleQuery"/>
+          </el-form-item>
+          <el-form-item label="連絡電話" prop="contactPhone">
+            <el-input v-model="queryParams.contactPhone"
+                      clearable
+                      maxlength="20" @keyup.enter="handleQuery"/>
+          </el-form-item>
+        <el-form-item>
+          <el-button icon="Search" type="primary" @click="handleQuery">検索</el-button>
+          <el-button icon="Refresh" type="primary" @click="resetQuery">クリア</el-button>
+        </el-form-item>
+    </el-form>
+
+    <el-table v-show="initLoadingCompleted" v-loading="listLoading" :border="true" :data="fcMemberList">
+      <el-table-column :show-overflow-tooltip="true" align="center" header-align="center" label="会員コード" min-width="80"
+                       prop="fcMemberCode"
+      >
+      </el-table-column>
+      <el-table-column :show-overflow-tooltip="true" align="left" header-align="center" label="会員名" min-width="70"
+                       prop="fcMemberName"
+      >
+      </el-table-column>
+      <el-table-column :show-overflow-tooltip="true" align="left" header-align="center" label="FC" min-width="80"
+                       prop="brandName"
+                       width=""/>
+      <el-table-column :show-overflow-tooltip="true" align="left" header-align="center" label="業種" min-width="60"
+                       prop="businessTypeName"
+                       width=""/>
+      <el-table-column :show-overflow-tooltip="true" align="left" header-align="center" label="エリア" min-width="90"
+                       prop="regionName"
+                       width=""/>
+      <el-table-column :show-overflow-tooltip="true" align="left" header-align="center" label="MyPage" min-width="70"
+                       prop="mypageAccessAuthName"
+                       width=""/>
+      <el-table-column :show-overflow-tooltip="true" align="left" header-align="center" label="連絡者" min-width="60"
+                       prop="contactPerson"
+                       width=""/>
+      <el-table-column :show-overflow-tooltip="true" align="center" header-align="center" label="連絡電話" min-width="70"
+                       prop="contactPhone"
+                       width=""/>
+           <el-table-column align="center" class-name="small-padding fixed-width" label="操作" min-width="180" width="300">
+        <template #default="scope">
+          <el-button @click="fcMemberEdit(scope.row)" v-hasPermi="['fcbi:fcMember:edit']"  icon="Edit" link type="primary" >編集</el-button>
+          <el-button v-hasPermi="['fcbi:fcMember:detail']" icon="Edit" link type="primary" >照会</el-button>
+          <el-tooltip  content="パスワードをリセット" placement="top">
+            <el-button icon="Key" link type="primary"
+                       @click="handleResetPwd(scope.row)"></el-button>
+          </el-tooltip>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination v-show="listTotalCnt>0"
+                v-model:limit="queryParams.pageSize"
+                v-model:page="queryParams.pageNum"
+                :total="listTotalCnt"
+                @pagination="getSearchList"/>
+  </div>
+</template>
+
+<script name="fcMemberList" setup>
+
+import {listMember,resetUserPwd} from "@/api/fcbi/fcMember.js"
+import {useRouter} from 'vue-router';
+import {formatMsg, parseAlphabetNumeric} from "@/utils/yamada.js";
+
+// 認証項目のテーブルデータを格納するリアクティブ
+const fcMemberList = ref([]);
+// データ読み込み中のローディング状態を管理するリアクティブ
+const listLoading = ref(false);
+// 検索結果の総件数を格納するリアクティブ
+const listTotalCnt = ref(0);
+// 初期ロードが完了したかどうかを示すリアクティブ
+const initLoadingCompleted = ref(false);
+const {proxy} = getCurrentInstance();
+const router = useRouter();
+const PWD_PATTERN = /^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[#?!@$%^&*-])[A-Za-z\d#?!@$%^&*-]{8,20}$/;
+
+/**
+ * コンポーネントの状態を管理するリアクティブオブジェクト
+ */
+const data = reactive({
+  form: {},
+  // 検索条件を格納するオブジェクト
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    fcMemberCode: '',
+    fcMemberName: '',
+    contactPerson: '',
+    contactPhone : '',
+  },
+});
+
+// リアクティブオブジェクトからプロパティを参照可能なオブジェクトに変換
+const {queryParams} = toRefs(data);
+
+const fcMemberEdit = (row) => {
+  router.push({
+    name: 'fcMemberEdit',
+    params: {
+      fcMemberId: row.fcMemberId
+    }
+  });
+};
+
+/**
+ * 検索ボタンのクリックイベントハンドラー
+ * 検索条件を初期ページに設定して検索を実行する
+ */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getSearchList();
+}
+
+/** パスワードをリセットボタンアクション */
+function handleResetPwd(row) {
+  proxy.$prompt(formatMsg('F0001', row.fcMemberCode ), "パ一スフ-ド再設定", {
+    confirmButtonText: "はい",
+    cancelButtonText: "いいえ",
+    closeOnClickModal: false,
+    inputErrorMessage: formatMsg('E0002'),
+    customClass: 'custom-prompt-box',
+    inputValidator: (value) => {
+      if (!PWD_PATTERN.test(value)) {
+        return formatMsg('E0002');
+      }
+    },
+  }).then(({value}) => {
+    resetUserPwd(row.fcMemberId, value, row.version).then(response => {
+      if (response.code === 200) {
+        // 編集に成功しました。新しいパスワードは:{0}
+        proxy.$modal.msgSuccess(formatMsg('I0006', value));
+        getSearchList();
+      }
+    });
+  }).catch(() => {
+  });
+}
+
+/**
+ * 発注リストを検索する関数
+ * APIを呼び出して検索条件に一致する発注データを取得する
+ */
+function getSearchList() {
+  listLoading.value = true;
+  let params = {
+    pageNum: queryParams.value.pageNum,
+    pageSize: queryParams.value.pageSize,
+    fcMemberCode: queryParams.value.fcMemberCode,
+    fcMemberName: queryParams.value.fcMemberName,
+    contactPerson: queryParams.value.contactPerson,
+    contactPhone : queryParams.value.contactPhone ,
+  };
+  listMember(params).then(response => {
+    fcMemberList.value = response.rows;
+    listTotalCnt.value = response.total;
+    listLoading.value = false;
+    initLoadingCompleted.value = true;
+  });
+}
+/**
+ * リセット ボタンアクション
+ */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+getSearchList();
+</script>
+
+<style>
+
+</style>