diff --git a/db/migrations/023_seed_momo_vendors_from_xlsx.sql b/db/migrations/023_seed_momo_vendors_from_xlsx.sql new file mode 100644 index 0000000..2afa6c6 --- /dev/null +++ b/db/migrations/023_seed_momo_vendors_from_xlsx.sql @@ -0,0 +1,91 @@ +-- 엑셀 (docs/모모유통 제조사 리스트(26.05.12).xlsx) 100개 공급업체 일괄 등록 +-- idempotent: supply_name 중복 시 skip + +INSERT INTO supply_mng (objid, supply_code, supply_name, charge_user_name, supply_tel_no, supply_busname, status, reg_id, reg_date) +SELECT + (SELECT COALESCE(MAX(objid),0) FROM supply_mng) + ROW_NUMBER() OVER (), + 'MM-' || LPAD(((SELECT COALESCE(MAX(objid),0) FROM supply_mng) + ROW_NUMBER() OVER ())::text, 4, '0'), + v.name, v.charger, v.tel, v.product, 'active', 'system', NOW() +FROM (VALUES +('주식회사 헤이필드 크리머리', '이지수 대표', '010-7244-4404', '유정란,유제품,치즈'), +('버터럼', '이지수 대표', '010-7244-4404', '노슈거, 뚜띠푸르티 과일즙/올리브유 외'), +('맛깔나는 모모수산', '김창완 대표', '010-7171-0070', '산지직송 수산'), +('신통방통푸드', '조용준 대표', '010-2222-3465', '보리쌈장'), +('플랜비', '김영헌 대표', '010-2965-9106', '듀라텍스외 화장품/식품'), +('비프스토리', '정찬/함휘령 대표', '010-3935-0076', '축산 /육가공'), +('에이슬링코리아', '김민재 대표', '010-5415-8753', '앙투어솔레 치즈/파스타외'), +('농업회사법인 그린라인 유한회사', '김남헌 수석 컨설턴트', '010-8704-4554', '유러피안 샐러드'), +('농업회사법인㈜대덕유통', '최광진 대표', '010-2774-6361', '1번 방사유정란'), +('오수연푸드', '신예진 과장', '010-3457-7080', '반찬류 외'), +('한울', '배우리 대리', '010-6855-1654', '한울김치 외'), +('한울팜스', '배우리 대리', '010-6855-1654', '비빔나물/ 한울 반찬 외'), +('자운두부', '대표', '010-4095-4149', ''), +('썬스토리', '김명준 상무', '010-9466-7098', '빛채울김치 외'), +('주식회사 상선에프앤비', '박선규 대표', '010-9938-7601', '간장게장/양념게장 외'), +('다온다코리아', '고요한 대표', '010-2995-1534', '덤핑/임박'), +('와이파이상사', '정종민 대표', '010-6648-9006', '화장품/식품/덤핑'), +('바른맛 자연', '대표', '010-8633-5816', '꽃징어 외 건어물'), +('그레잇 코리아', '정현경 팀장', '010-9100-4505', '김치/장아찌'), +('주식회사 야식창고', '도주형 대표', '010-8834-8874', '쿵딘쌀국수 외'), +('팔덕팩토리', '김경민 대표', '010-2927-7054', '팔덕식당 등갈비찜'), +('㈜성우트레이딩', '홍순석 대표', '010-6571-1440', '생선까스/밀키트 외'), +('오름 에프엔비', '정현주', '010-5115-0440', '대장쪽갈비'), +('㈜ 삼부에프씨', '조은실 대표', '010-9282-1150', '로움갈비'), +('벨라마켓', '김수진 대표', '010-4199-7321', '여수해적 밀키트 외'), +('르구르망', '차장님', '010-2442-6279', '치즈 외 유제품'), +('민속떡집', '정미화 대표', '010-8221-3846', '쑥개떡 외'), +('경기떡집', '마충렬 팀장', '010-4123-0626', '이티떡/미숫가루 외'), +('이랜드 팜앤푸드', '김승만 파트장', '010-6501-8768', '에슐리 밀키트 외'), +('퐈퐈마켓', '정수민 대리', '010-8495-0026', '초례청 약과 외'), +('덕스에프앤비', '이세환 대표', '010-5663-4764', '국물닭발 외'), +('오웬푸드 셰프애찬', '김영미 이사', '010-8818-2243', '셰프애찬 김치 외'), +('대명수산', '서태명 대표', '010-4992-5424', '과메기/ 수산밀키트 외'), +('정만수산', '대표', '010-7352-8882', '알탕 수산밀키트'), +('순진식품 영농회사법인', '이도규 부장', '010-5757-3954', '순진콩물'), +('한국해양수산', '이도경 대표', '010-3075-5598', '통영 수산물'), +('에스티식품', '허주원 대표', '010-6330-8032', '화명동 떡볶이'), +('㈜솔푸드', '대표', '', '뚱이만두'), +('진도 삼촌네', '대표', '010-5161-7603', '초당옥수수'), +('성부유통', '국수호 대표', '010-4233-9257', '가락청과 과일'), +('연동치미', '실장님', '010-4792-0023', ''), +('달을성농장', '윤성규 대표', '010-7585-0988', '샐러드팩'), +('아이캔두잇', '대표', '010-5276-5680', '스낵류'), +('피와이푸드', '박정수 대표', '010-7417-5800', '월남쌈 외'), +('간식어장', '이재선 대표', '010-2987-0444', '떡볶이/분식밀키트'), +('통큰수산', '조성우 전무', '010-9852-2734', '홍게/수산밀키트'), +('조선물산', '추희수 대리', '010-9791-8515', ''), +('오로라 에프앤비', '김리나 대표', '010-8445-2269', '양송이스프/치즈스틱 외'), +('초이스엠 코리아', '강정회 대표', '010-3200-6722', '양갈비 숄더랙'), +('글로비스 얼라이언스', '이승관 본부장', '010-3198-1742', '나탈리스 주스/밀키트 외'), +('덕컴퍼니', '강나래 대표', '010-9793-1117', '덤핑 외'), +('예령산업', '최우영 대표', '010-3350-3184', '철호국밥 외'), +('보라티알', '백민기 차장', '010-3722-1951', '데체코 올리브유 외'), +('에스디지 코퍼레이션', '양정규 대표', '010-6242-5098', '순대국 외'), +('더존푸드', '김준열 담당', '010-8507-9972', '국물닭발 외'), +('약단밤 이야기', '김영미 대표', '010-5671-6679', '생율, 약단밤'), +('남동공단 떡볶이', '대표', '010-9441-7901', '떡볶이/분식밀키트'), +('주식회사 온다미', '지현진 과장', '010-6564-4767', '반건오징어,수산'), +('차림에프엔비', '차주영 대표', '010-2582-4294', '삼일카레'), +('청담푸드', '박성태 대표', '010-7236-4988', '직화 알곱창'), +('촌드레 푸드', '전준동 대표', '010-8450-9944', '코다리 조림'), +('농업회사법인 ㈜ 애담', '대표', '010-3734-6595', '강화 약숙찹쌀떡'), +('주안고기백화점', '원기연 대표', '010-5431-3020', '쫙갈비(다원미트)'), +('㈜엘에푸푸드', '조성국 팀장', '010-8-4084-2097', 'LF푸드'), +('㈜대일본초', '전종호 대표', '010-3320-1848', '고구마칩'), +('이레축산', '박지헌 대표', '010-5612-4079', '정육(엠마오미트)'), +('영성', '김금영 대표', '010-2981-3427', '생강청 외'), +('이천쌀 김부각', '오경선 대표', '010-7194-3256', '이천 김부각'), +('㈜해늘', '최연준 이사', '010-9887-6256', '순대국'), +('유통몬스터', '최원철 대표', '010-5370-6123', '명인카스테라'), +('진보 건어물', '이주송 대표', '010-3167-4210', '쥐포'), +('서락비', '대표', '010-9070-2227', '닭갈비'), +('화앤닭', '대표', '010-6353-2223', '닭갈비'), +('치즈앤푸드', '정예슬대리', '010-2692-6066', '치즈/유제품 외'), +('오늘의 즐거움', '장주희 대표', '010-3795-3961', '밀키트 외'), +('그래비티', '김선영대표', '010-7176-8335', '애사비'), +('㈜동추원FNB', '박동신대표', '010-6341-0520', '소불고기 밀키트'), +('선산이조곱창', '대표', '010-5369-8272', '곱창전골'), +('단풍고을', '대표', '010-5351-2833', '떡'), +('엘리스유통', '대표', '010-2447-3002', '화장품/덤핑') +) AS v(name, charger, tel, product) +WHERE NOT EXISTS (SELECT 1 FROM supply_mng s WHERE s.supply_name = v.name); diff --git a/src/app/(main)/m/admin/makers/page.tsx b/src/app/(main)/m/admin/makers/page.tsx deleted file mode 100644 index 163a923..0000000 --- a/src/app/(main)/m/admin/makers/page.tsx +++ /dev/null @@ -1,265 +0,0 @@ -"use client"; - -import { useEffect, useState, FormEvent } from "react"; -import { Plus, Search, Pencil, Trash2, Factory } from "lucide-react"; -import Swal from "sweetalert2"; - -interface Maker { - OBJID: string; - MAKER_NAME: string; - CONTACT: string; - PHONE: string; - MEMO: string; - REGDATE: string; -} - -export default function AdminMakersPage() { - const [makers, setMakers] = useState([]); - const [keyword, setKeyword] = useState(""); - const [editing, setEditing] = useState | null>(null); - const [saving, setSaving] = useState(false); - - const load = async () => { - const res = await fetch("/api/m/makers/list", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ keyword }), - }); - setMakers((await res.json()).RESULTLIST ?? []); - }; - - useEffect(() => { - load(); - }, []); // eslint-disable-line - - const onSave = async (e: FormEvent) => { - e.preventDefault(); - if (!editing) return; - setSaving(true); - try { - const isNew = !editing.OBJID; - const res = await fetch("/api/m/makers/save", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ - objid: editing.OBJID, - actionType: isNew ? "regist" : "update", - makerName: editing.MAKER_NAME, - contact: editing.CONTACT, - phone: editing.PHONE, - memo: editing.MEMO, - }), - }); - const j = await res.json(); - if (j.success) { - Swal.fire({ icon: "success", title: j.message, timer: 1200, showConfirmButton: false }); - setEditing(null); - load(); - } else { - Swal.fire({ icon: "error", title: "저장 실패", text: j.message }); - } - } finally { - setSaving(false); - } - }; - - const onDelete = async (objid: string, name: string) => { - const ok = await Swal.fire({ - icon: "warning", - title: `"${name}" 삭제`, - text: "삭제하시겠습니까?", - showCancelButton: true, - confirmButtonText: "삭제", - cancelButtonText: "취소", - confirmButtonColor: "#dc2626", - }); - if (!ok.isConfirmed) return; - const res = await fetch("/api/m/makers/delete", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ objids: [objid] }), - }); - const j = await res.json(); - if (j.success) { - Swal.fire({ icon: "success", title: j.message, timer: 1200, showConfirmButton: false }); - load(); - } else { - Swal.fire({ icon: "error", title: "오류", text: j.message }); - } - }; - - const set = (k: keyof Maker) => (e: React.ChangeEvent) => - setEditing((prev) => prev ? { ...prev, [k]: e.target.value } : prev); - - return ( -
-
-
-

제조사 관리

-

총 {makers.length}개

-
- -
- -
-
- - setKeyword(e.target.value)} - onKeyDown={(e) => e.key === "Enter" && load()} - placeholder="제조사명 검색" - className="w-full h-10 pl-9 pr-3 rounded-lg border border-slate-200 text-sm focus:border-emerald-500 outline-none" - /> -
- -
- - {/* 모바일: 카드 */} -
- {makers.length === 0 ? ( -
제조사가 없습니다.
- ) : makers.map((m) => ( -
-
- -
-
- {m.MAKER_NAME} -
- - -
-
-
-
📞 {m.PHONE || "-"} {m.CONTACT && `· ${m.CONTACT}`}
- {m.MEMO &&
📝 {m.MEMO}
} -
등록 {m.REGDATE}
-
-
-
-
- ))} -
- - {/* 데스크탑: 표 */} -
- - - - - - - - - - - - - {makers.length === 0 ? ( - - - - ) : ( - makers.map((m) => ( - - - - - - - - - )) - )} - -
제조사명담당자연락처메모등록일작업
- 제조사가 없습니다. 신규 등록 버튼을 눌러주세요. -
{m.MAKER_NAME}{m.CONTACT || "-"}{m.PHONE || "-"}{m.MEMO || "-"}{m.REGDATE} - - -
-
- - {/* 등록/수정 모달 */} - {editing && ( -
setEditing(null)} - > -
e.stopPropagation()} - className="bg-white rounded-xl shadow-xl w-full max-w-lg p-6" - > -

- {editing.OBJID ? "제조사 수정" : "제조사 등록"} -

-
-
- - -
-
-
- - -
-
- - -
-
-
- -